【问题标题】:Algebraic Types - Haskell代数类型 - Haskell
【发布时间】:2019-04-23 01:24:18
【问题描述】:

我正在使用 Haskell 中的代数类型,从工作表中做一些练习。我做了以下练习:

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

我的练习代码:

data Point = Point Float Float
  deriving (Show)
  1. 使用 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:错误:不在范围内:数据构造函数“Shape” 失败,已加载模块:无。

谁能解释一下为什么会出现这个错误,我该如何解决?我对代数类型有点困惑,我尝试了很多东西,但似乎我无法找到解决方案。

【问题讨论】:

    标签: haskell algebraic-data-types


    【解决方案1】:

    您需要在数据构造函数(如CircleRectangle)上进行模式匹配,而不是像您现在尝试在类型构造函数上那样(如Shape)。对于PositionedShape,它们恰好有相同的名称,虽然你完全忘记了这个匹配(事实上,你根本不需要关心内部的Shape,除了复制它)。此外,move 是指将形状移动给定距离,而不是将其移动到新的给定位置;。

    【讨论】:

    • 非常感谢!有点愚蠢的问题,但我是 Haskell 的新手 :)
    【解决方案2】:

    您需要使用PositionedShape 构造函数来拆分PositionedShape 您已经使用了Shape 构造函数。

    尝试从:

    移动(PositionedShape 形状(Point old_x old_y))[...]

    【讨论】:

      【解决方案3】:

      怎么样

      move (PointedShape s (Point x y)) dx dy = PointedShape s (Point (x+dx) (y+dy))
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多