我试图创建数据类型"图"在Haskell中,此数据类型应具有多个值:
方形(带参数长度)
三角形(带参数长度)
圆圈(带参数半径)
每个人物也应该有一个颜色(让我们说黑白),这就是我的代码目前的样子,但这并不起作用。 任何人都可以帮助我吗?
class Figure_ a where
perimeter :: a -> Double
area :: a -> Double
data Figure = forall a. Figure_ a => Figure a
type Radius = Double
type Side = Double
type Color = String
data Circle = Circle Radius
data Triangle = Triangle Side
data Square = Square Side
instance Figure_ Circle where
perimeter (Circle r) = 2 * pi * r
area (Circle r) = pi * r * r
instance Figure_ Triangle where
perimeter (Triangle x y) = 2*(x + y)
area (Triangle x y) = x * y
instance Figure_ Square where
perimeter (Square s) = 4*s
area (Square s) = s*s
instance Figure_ Figure where
perimeter (Figure shape) = perimeter shape
答案 0 :(得分:3)
forall
使用:
{-# LANGUAGE ExistentialQuantification #-}
此外,您的三角形接受两个参数,因此它应该是这样的:
data Triangle = Triangle Side Side
但是看看你的Triangle的公式,我觉得你似乎把它与Rectangle混淆了。此外,您的代码缩进似乎不正确。您的代码应如下所示:
class Figure_ a where
perimeter :: a -> Double
area :: a -> Double
创建该类型类的实例时,也应遵循相同的缩进规则。
答案 1 :(得分:2)
我试图在Haskell中创建数据类型“图”,这个数据类型应该有多个值:
- 方形(带参数长度)
- ...
- 圆圈(带参数半径)
我忽略了三角形以避免考虑几何。无论如何,问题听起来像你可能想要以下内容:
data Figure = Square Double | ... | Circle Double
然后你可以定义如下函数:
area :: Figure -> Double
area (Square side) = side * side
area ... = ...
area (Circle radius) = pi * radius * radius
如果您只需要一种数据类型,则不需要Haskell中的类。当Haskell类都支持公共接口时,Haskell类具有多种数据类型。
有一个理由比class
和forall
优先选择data
和{{1}}更简单的版本只有{{1}}:在您的版本中,更容易添加另一种数字没有计划。如果您认为需要这个,可能需要阅读existential typeclass反模式。但是如果你只是想在Haskell中代表数字,我肯定会从一个简单的数据类型开始。