C#与Haskell之间的通信 - c#

我有这个Haskell代码:

module RectangleMover where

data Point = Point Int Int deriving (Show)
movePoint :: Point -> Int -> Int -> Point
movePoint (Point x y) dx dy = Point (x + dx) (y + dy)

data Rectangle = Rectangle { corner :: Point, width :: Int, height :: Int } deriving (Show)
move :: Rectangle -> Int -> Int -> Rectangle
move r@(Rectangle {corner=c}) dx dy = r { corner = movePoint c dx dy }

p = Point 1 2
hsRec = Rectangle p 10 20

与此等效的C#代码为:

class Point
{
    private int x;

    private int y;

    public Point(int x, int y)
    {
        this.x = x;
        this.y = y;
    }

    public void Move(int dx, int dy)
    {
        this.x += dx;
        this.y += dy;
    }
}

class Rectangle
{
    private Point point;

    private int width;

    private int height;

    public Rectangle(Point p, int width, int height)
    {
        this.point = p;
        this.width = width;
        this.height = height;
    }

    public void Move(int dx, int dy)
    {
        this.point.Move(dx, dy);
    }
}

Point p = new Point(1,2);
Rectangle csRec = new Rectangle(p, 10, 20);

我的问题现在是如何将“实例” hsRec Haskell传递给C#,以及如何将csRec从C#传递给Haskell。在这种情况下,常见的方法是使用FFI从Haskell代码创建DLL,然后从C#调用此DLL。同样,从C#创建DLL并从Haskell调用此DLL。

要从Haskell导出,这里是一个带有整数的简单示例:

{-# LANGUAGE ForeignFunctionInterface #-}

module Add () where

import Foreign.C.Types

add :: CInt -> CInt -> CInt
add x y = x + y

foreign export ccall add :: CInt -> CInt -> CInt

但是如何在这些语言之间传递更复杂的类型呢?在这种情况下,传递矩形类型的对象。
是否可以将对象转换为JSON或XML字符串并将其传递给另一种语言?

参考方案

您的选择如下:

手动将所有C#/ Haskell结构与普通C结构相互转换。 (高性能,编写复杂,难以调试)。
手动将您的C#/ Haskell结构序列化/反序列化为JSON / XML / YAML / CSV /等等。 (较低的性能,非常容易调试。)
对于每个数据结构,手动编写和公开知道如何从中获取琐碎数据的函数。 (例如,如果您有Haskell Map,则导出函数可以一次获取一个密钥,而这对于C来说是微不足道的,然后从C#端进行包装。)

AFAIK,无法“直接”或“自动”使C#理解Haskell对象的布局,反之亦然。

在PHP中使用long int - php

我正在尝试此方法,但无法存储较大的价值$var = rand(100000000000000,999999999999999); echo $var; // prints a 9 digit value(largest possible) 如何获得期望值? 参考方案 PHP整数通常为32位。其他软件包提供了更高精度的整数:http://php.net/man…

C#Linq可空INT字段包含在List <int>中SQL转换 - c#

我有一张表格,其中列出了需要管理员签名的表单,而我想要做的就是将表单列表过滤到他们可以签名的表单。我得到了他们所管理的员工列表,然后将其放入员工ID列表中。var staffIds = manager.Staff.Select(x => x.Id).ToList(); 然后,我使用人员列表过滤表单列表。我得到了所有与经过身份验证的组织ID相匹配的表单,…

为什么我的按位运算不能在Java中与`int`一起使用? - java

我刚得到以下编译器错误:./package/path/FrameScreenPosition.java:80: incompatible types found : int required: boolean if (frame.getExtendedState() & Frame.MAXIMIZED_BOTH) { ^ “扩展状态”是各种不同状态的…

在AtomicInteger.addAndGet(int)中使用无限循环 - java

在Java包中,java.util.concurrent.atomic AtomicInteger类具有方法addAndGet(int)这是public final int addAndGet(int delta) { for (;;) { int current = get(); int next = current + delta; if (compar…

剃刀付款集成->如何通过关闭按钮X检测剃刀付款模型是否关闭 - javascript

当用户关闭而无需付款时,我在CI框架中使用Razorpay,请创建razor支付模型,然后取消订单,我希望按状态更改为已取消的状态触发查询。所以我怎么能检测到这一点。我已经通过单击jQuery单击关闭功能但无法使用... javascript大神给出的解决方案 Razorpay提供了JS方法来检测模式关闭。您编写的任何JS代码都不会在结帐页面上运行,因为它是…