所以我已经逛了好几个小时,找不到适合我需要的答案,尽管许多人都在同一行,所以很抱歉这是某种重新发布的方式。
在haskell中,我有这个
shapeToPicture :: Shape -> Picture
shapeToPicture (Line p1 p2) = polyline [p1, p2]
shapeToPicture (Rectangle x y) = solidRectangle x y
shapeToPicture (Polygon [points]) = solidPolygon [points]
shapeToPicture (Polygon []) = solidPolygon []
shapeToPicture (Polygon x) = solidPolygon x
shapeToPicture (Ellipse a b) = scaled(solidCircle(1), a, b)
shapeToPicture (Circle a b) = (solidCircle (a, b))
将会编译多边形和直线,但是Rectangle,Circle和Ellipse将显示错误消息
src/View.hs:46:57: error:
• Couldn't match type ‘(Double, Double)’ with ‘Double’
Expected type: Double
Actual type: Coords
• In the second argument of ‘solidRectangle’, namely ‘b’
In the expression: (solidRectangle a b)
In an equation for ‘shapeToPicture’:
shapeToPicture (Rectangle a b) = (solidRectangle a b)
|
46 | shapeToPicture (Rectangle a b) = (solidRectangle a b)
| ^
Failed, two modules loaded.
我知道我有一个带坐标的构造函数“ Rectangle”,和一个带Double的代码世界函数“ solidRectangle”,但是我不知道如何匹配它们,以便代码可以编译。出于相同原因,Circle和Ellipse的此消息相同。
注意:这是定义构造函数的方式
type Coords = (Double, Double)
data Shape
= Line Coords
Coords
| Polygon [Coords]
| Rectangle Coords
Coords
| Circle Coords
Coords
| Ellipse Coords
Coords
deriving (Show)
谢谢。
答案 0 :(得分:1)
正如您所指出的那样,您的问题是solidRectangle将double作为第二个参数,并且您将double(Coords
)的元组传递给了它。
shapeToPicture (Rectangle x y) = solidRectangle x y -- By data definition y :: (Double, Double)
根据y
在solidRectangle x y
中的含义,您可以选择(Double, Double)
的第一个或第二个。例如
shapeToPicture (Rectangle x y) = solidRectangle x $ fst y
答案 1 :(得分:1)
您的Rectangle
的{{1}}构造函数的类型为Shape
,与Coords -> Coords -> Shape
相同。涉及四个数字,存储为两对,每对两个。您的模式匹配如下所示:
(Double, Double) -> (Double, Double) -> Shape
如果您匹配类型,则会发现shapeToPicture (Rectangle x y) = solidRectangle x y
和x :: Coords
。因此y :: Coords
和x
都是数字的“ 对”,而不是单个数字。
这可能不是您想要的。您可能意思是这样的:
y
模式匹配现在将两对分开,为您提供每个坐标内x和y坐标的名称。
下一个问题是如何填写右侧。不幸的是,这取决于shapeToPicture (Rectangle (x1, y1) (x2, y2)) = ...
构造函数的含义 ,我不知道。你呢?您是自己设计类型的,还是作为作业的一部分给出的?如果您不知道这是什么意思,那么您可能需要先弄清楚这一点,然后才能写出该等式的右侧。