【发布时间】:2013-05-29 02:18:16
【问题描述】:
我想通过 Haskell FFI 在 C++ 中实现一个函数,它的(最终)类型应该是 String -> String。比如说,是否可以重新实现以下具有完全相同签名的 C++ 函数?
import Data.Char
toUppers:: String -> String
toUppers s = map toUpper s
特别是,我想避免在返回类型中包含 IO,因为在逻辑上没有必要为这个简单的任务引入杂质(我的意思是 IO monad)。到目前为止,我看到的所有涉及 C 字符串的示例都涉及返回一个 IO 东西或 Ptr,它不能转换回纯 String。
我想这样做的原因是我的印象是编组与 FFI 混淆。也许如果我能解决上面最简单的情况(除了原始类型,如 int),那么我可以在 C++ 端做任何我想要的数据解析,这应该很容易。
与我想要在编组到/从字符串之间进行的计算相比,解析的成本可以忽略不计。
提前致谢。
【问题讨论】:
-
您能否提供更多关于您想要完成的任务的详细信息?来自 The RWH book.realworldhaskell.org/read/interfacing-with-c-the-ffi.html “但是,如果我们知道 C 代码是纯的,我们为什么不直接声明它,在导入声明中给它一个纯类型?因为我们必须分配本地内存为了使 C 函数能够使用, 这必须在 IO monad 中完成, 因为它是一个本地副作用. 但是, 这些效果不会逃避外部调用周围的代码, 所以当包装时, 我们使用 unsafePerformIO 重新引入纯度。”
-
@Jonke:更具体地说,我想做简单的计算(对于 C++),例如在 C++ 中求解线性方程组。解决方案需要在 C++ 中完成。这就是为什么我想使用 String 或等效(最终)跨 FFI 传输数据的原因。因此,我正在寻找一个在不引入 IO 的情况下将字符串或等价物编组到 C++ 世界的示例。顺便说一句,当我使用 windows/mingw 时,hmatrix 对我不起作用。所以我认为最可靠的解决方案是按照我上面的描述找出一个有效的 FFI 源。
-
好吧,我认为你陷入了 C 领域。如果您想将整数或双精度数组(向量)从 haskell 传输到 C/C++ 并返回,则其签名将与传输 C 字符不同。 Haskell 中的字符串与 C char[] 完全不同。
标签: string haskell ffi purely-functional