gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 22:47:34 24 4
gpt4 key购买 nike

我有这个 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# 端包装它。)

据我所知,没有办法“直接”或“自动”让 C# 理解 Haskell 对象的布局,反之亦然。

关于c# - C# 和 Haskell 之间的通信,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38118710/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com