首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >代数类型- Haskell

代数类型- Haskell
EN

Stack Overflow用户
提问于 2019-04-23 01:24:18
回答 3查看 202关注 0票数 2

我在Haskell和代数类型一起工作,做一些练习题。我有以下练习:

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

我的本练习代码:

代码语言:javascript
复制
data Point = Point Float Float
  deriving (Show)

  1. 使用Point,定义形状数据类型的修改版本PositionedShape,其中除了形状的尺寸外,还包括形状的中心点。

先前定义的形状数据:

代码语言:javascript
复制
data Shape = Circle Float |
             Rectangle Float Float
             deriving (Show)

我的本练习代码:

代码语言:javascript
复制
data PositionedShape = PositionedShape Shape Point
  deriving (Show)

现在我的问题出现在下面一个:

定义一个函数: haskell move :: PositionedShape -> Float -> Float -> PositionedShape ,它以给定的x和y距离移动形状。

--我的实现如下:

代码语言:javascript
复制
move :: PositionedShape -> Float -> Float -> PositionedShape
move (Shape (Point x y)) newX newY = Shape (Point newX newY)

这是在返回错误:

周8.hs:103:7:错误:不在作用域:数据构造函数“形状”失败,模块加载:无。

有人能解释一下为什么会出现这个错误吗?如何解决呢?我有点搞不懂代数类型,我尝试了很多东西,但似乎我无法得到一个解。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2019-04-23 01:49:27

您需要对数据构造函数(如CircleRectangle)进行模式匹配,而不是像现在所做的那样在类型构造函数上进行模式匹配(比如Shape)。对于PositionedShape,它们碰巧有相同的名称,尽管您完全忘记了这一次的匹配(实际上,除了复制它之外,您根本不需要关心内部Shape )。另外,move是指按给定的距离移动形状,而不是将其移动到一个新的给定位置;

票数 4
EN

Stack Overflow用户

发布于 2019-04-23 04:17:34

您需要使用PositionedShape构造函数来分解已使用Shape构造函数的PositionedShape

试着从以下几点开始:

移动(PositionedShape shape (点old_x old_y))

票数 2
EN

Stack Overflow用户

发布于 2019-04-23 06:58:50

怎么样

代码语言:javascript
复制
move (PointedShape s (Point x y)) dx dy = PointedShape s (Point (x+dx) (y+dy))
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55803072

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档