gpt4 book ai didi

haskell - 如何将元素添加到 Haskell 中的数据类型列表

转载 作者:行者123 更新时间:2023-12-02 07:27:58 26 4
gpt4 key购买 nike

我定义了两种数据类型:点和曲线。 Point 的坐标有两个 double ,Curve 有一个起点和一个代表曲线其余部分的点列表。我需要创建一个函数,在给定起点和点列表的情况下创建此曲线,但我不太明白我应该如何将元素添加到曲线内的点列表中。这是我的代码:

data Point = Point Double Double deriving (Eq, Show)
point :: (Double, Double) -> Point
point (x, y) = Point x y

data Curve = Curve Point [Point] deriving (Eq, Show)

curve :: Point -> [Point] -> Curve
curve x [] = Curve x []
curve x [y] = Curve x [y]
curve x (y:ys) = curve x (y:ys)

我很确定我的递归最终是错误的。那么你能给我一些关于如何在列表中添加点的指导吗?

谢谢

最佳答案

myCurve = Curve (Point 2 2) [Point 3 3, Point 4 4, Point 5 5]

等等,你说什么?事实上,Curve 已经是您想要的函数。它既是类型构造函数(数据定义中的左侧)又是值构造函数(右侧)。

如果你用 ghci 探测 Curve,你会发现......

Prelude> :t Curve
Curve :: Point -> [Point] -> Curve

Point 也是如此。换句话说,您的整个代码如下所示:

data Point = Point Double Double deriving (Eq, Show)
data Curve = Point [Point] deriving (Eq, Show)

编辑:值(value)构造函数的超小型入门书。

当你创建一个新的数据类型时,你会自动创建一个值构造函数,它是一个创建新类型值的函数。在您的示例中并不完全清楚,因为类型和值构造函数具有相同的名称,这在 Haskell 中是允许的,因为一个位于类型级别,另一个位于值级别。让我们试着让它更明显一点:

data MyIntType = MakeIntType Int

现在,MakeIntType 是一个函数,它接受一个参数,一个 Int,并创建一个 MyIntType 类型的值。让我们在 ghci 中检查一下:

Prelude> :t MakeIntType
MakeIntType :: Int -> MyIntType

现在,我们可以编写一个相同的函数,就像您提议的那样:

makeIntType :: Int -> MyIntType
makeIntType x = MakeIntType x

或者,删除显式点(参数):

makeIntType = MakeIntType

这两个等式都表明我们重复了工作。 makeIntType 和 MakeIntType 之间没有功能上的区别。它们是完全等价的,并且由于您将始终“免费”获得值构造函数,因此 makeIntType 是已经存在的东西的完全多余的别名。

我希望这能让事情变得更清楚一些。

编辑 2:根据现有曲线创建新的修改后的曲线

addPointToStartOfCurve p (Curve p' ps) = Curve p (p':ps)

在这里,我们通过将现有曲线的第一个元素插入点列表并添加新起点,从现有曲线创建新曲线。另一种变体会在现有曲线的末尾添加一个点。

addPointToEndOfCurve p (Curve p' ps) = Curve p' (ps ++ [p])

请注意,由于不变性,原始曲线不会改变,我们只是产生新值。

关于haskell - 如何将元素添加到 Haskell 中的数据类型列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25699760/

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