代数类型-Haskell

Nic*_*kor 3 haskell algebraic-data-types

我正在处理Haskell中的代数类型,并在工作表中进行一些练习。我进行了以下练习:

  1. 定义代数类型Point,以表示二维空间中的点(的坐标)。

我的练习代码:

data Point = Point Float Float
  deriving (Show)
Run Code Online (Sandbox Code Playgroud)
  1. 使用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'失败,模块已加载:无。

有人可以向我解释为什么这个错误,我该如何解决?我对代数类型有些困惑,我尝试了很多事情,但似乎无法解决。

Jos*_*ica 5

您需要在数据构造函数(例如CircleRectangle)上进行模式匹配,而不是像现在那样在类型构造函数上进行模式匹配(例如Shape)。对于PositionedShape,它们恰好具有相同的名称,尽管您完全忘记了与此匹配(实际上,您不需要关心内部Shape,除非将其复制通过)。另外,move是指将形状移动给定距离,而不是将其移动到新的给定位置;