Nic*_*kor 3 haskell algebraic-data-types
我正在处理Haskell中的代数类型,并在工作表中进行一些练习。我进行了以下练习:
- 定义代数类型Point,以表示二维空间中的点(的坐标)。
我的练习代码:
data Point = Point Float Float
deriving (Show)
Run Code Online (Sandbox Code Playgroud)
- 使用Point定义Shape数据类型的修改版本PositionedShape,其中包括形状的中心以及尺寸。
先前定义的形状数据:
data Shape = Circle Float |
Rectangle Float Float
deriving (Show)
Run Code Online (Sandbox Code Playgroud)
我的练习代码:
data PositionedShape = PositionedShape Shape Point
deriving (Show)
Run Code Online (Sandbox Code Playgroud)
现在我的问题出现在这个问题中:
定义一个函数:
haskell move :: PositionedShape -> Float -> Float -> PositionedShape将形状移动给定的x和y距离
我对此的实现如下:
move :: PositionedShape -> Float -> Float -> PositionedShape
move (Shape (Point x y)) newX newY = Shape (Point newX newY)
Run Code Online (Sandbox Code Playgroud)
这将返回此错误:
Week8.hs:103:7:错误:不在范围内:数据构造函数'Shape'失败,模块已加载:无。
有人可以向我解释为什么这个错误,我该如何解决?我对代数类型有些困惑,我尝试了很多事情,但似乎无法解决。
您需要在数据构造函数(例如Circle和Rectangle)上进行模式匹配,而不是像现在那样在类型构造函数上进行模式匹配(例如Shape)。对于PositionedShape,它们恰好具有相同的名称,尽管您完全忘记了与此匹配(实际上,您不需要关心内部Shape,除非将其复制通过)。另外,move是指将形状移动给定距离,而不是将其移动到新的给定位置;