在C#中使用高阶Haskell类型

时间:2011-07-03 10:35:44

标签: c# haskell ffi

如何使用C#(DLLImport)中的高阶类型签名来使用和调用Haskell函数,如...

double :: (Int -> Int) -> Int -> Int -- higher order function

typeClassFunc :: ... -> Maybe Int    -- type classes

data MyData = Foo | Bar              -- user data type
dataFunc :: ... -> MyData

C#中相应的类型签名是什么?

[DllImport ("libHSDLLTest")]
private static extern ??? foo( ??? );

另外(因为它可能更容易):我如何在C#中使用“未知”Haskell类型,所以我至少可以传递它们,而不知道任何特定类型的C#?我需要知道的最重要的功能是传递类型类(如Monad或Arrow)。

我已经知道how to compile a Haskell library to DLL并在C#中使用,但仅适用于一阶函数。我也知道Stackoverflow - Call a Haskell function in .NETWhy isn't GHC available for .NEThs-dotnet,我没有找到任何文档和示例(针对C#到Haskell方向)。

3 个答案:

答案 0 :(得分:18)

答案 1 :(得分:4)

您是否尝试通过FFI导出功能?这允许您为函数创建更多C-ish接口。我怀疑可以直接从C#调用Haskell函数。有关更多信息,请参阅doc。 (上面的链接)。

在做了一些测试之后,我认为通常不可能通过FFI输出带有类型参数的高阶函数和函数。 [Citation needed]

答案 2 :(得分:3)

好的,感谢FUZxxl,他为“未知类型”提出了一个解决方案。将数据存储在IO上下文中的Haskell MVar 中,并使用一阶函数从C#传递到Haskell。这可能是至少在简单情况下的解决方案。