代数类型-Haskell

时间:2019-04-23 01:24:19

标签: haskell algebraic-data-types

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

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

我对此练习的代码:

data Point = Point Float Float
  deriving (Show)
  
      
  1. 使用Point定义Shape数据类型的修改版本PositionedShape,其中   除了形状的尺寸外,还包括形状的中心点。
  2.   

先前定义的形状数据:

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:错误:不在范围内:数据构造函数“形状”   失败,模块已加载:无。

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

3 个答案:

答案 0 :(得分:5)

您需要对数据构造函数(例如CircleRectangle)进行模式匹配,而不是像现在尝试进行的类型构造函数(例如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))