我正在处理Haskell中的代数类型,在工作表中进行一些练习。我进行了以下练习:
- 定义一个代数类型Point,以表示二维空间中的点(的坐标)。
我对此练习的代码:
data Point = Point Float Float
deriving (Show)
- 使用Point定义Shape数据类型的修改版本PositionedShape,其中 除了形状的尺寸外,还包括形状的中心点。
先前定义的形状数据:
data Shape = Circle Float |
Rectangle Float Float
deriving (Show)
我对此练习的代码:
data PositionedShape = PositionedShape Shape Point
deriving (Show)
现在我的问题是这个问题:
定义一个功能:
haskell move :: PositionedShape -> Float -> Float -> PositionedShape
将形状移动给定的x和y距离
我为此执行的操作如下:
move :: PositionedShape -> Float -> Float -> PositionedShape
move (Shape (Point x y)) newX newY = Shape (Point newX newY)
这将向我返回此错误:
Week8.hs:103:7:错误:不在范围内:数据构造函数“形状” 失败,模块已加载:无。
有人可以向我解释为什么这个错误,我该如何解决?我对代数类型有些困惑,我尝试了很多事情,但似乎无法解决。
答案 0 :(得分:5)
您需要对数据构造函数(例如Circle
和Rectangle
)进行模式匹配,而不是像现在尝试进行的类型构造函数(例如Shape
)进行模式匹配。对于PositionedShape
,它们恰好具有相同的名称,尽管您完全忘记了与此匹配(实际上,您不需要关心内部的Shape
,只需要复制它即可)通过)。另外,move
的作用是将形状移动给定的距离,而不是将其移动到新的给定位置;
答案 1 :(得分:3)
您需要使用PositionedShape
构造函数来拆分PositionedShape
,而使用Shape
构造函数。
尝试从以下开始:
移动(PositionedShape形状(点old_x old_y))[...]
答案 2 :(得分:2)
怎么样
move (PointedShape s (Point x y)) dx dy = PointedShape s (Point (x+dx) (y+dy))