在Haskell中创建数字

时间:2014-04-05 15:25:54

标签: haskell

我试图创建数据类型"图"在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

2 个答案:

答案 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类具有多种数据类型。

有一个理由比classforall优先选择data和{{1}}更简单的版本只有{{1}}:在您的版本中,更容易添加另一种数字没有计划。如果您认为需要这个,可能需要阅读existential typeclass反模式。但是如果你只是想在Haskell中代表数字,我肯定会从一个简单的数据类型开始。