在Haskell中引入形状数据类型

在Haskell中引入形状数据类型,haskell,algebraic-data-types,Haskell,Algebraic Data Types,我在一本书中看到了这个练习,我正在尝试做它,但我有一个问题 我想做的是定义一个适合表示三角形、正方形和圆形的数据类型形状,然后定义一个函数area::Shape->Float,它返回给定形状的面积 我现在的代码: data Shape = Triangle Float Float Float | Square Float | Circle Float area :: Shape -> Float area (Triangle a b c) = sqrt (s*(

我在一本书中看到了这个练习,我正在尝试做它,但我有一个问题

我想做的是定义一个适合表示三角形、正方形和圆形的数据类型形状,然后定义一个函数area::Shape->Float,它返回给定形状的面积

我现在的代码:

data Shape = Triangle Float Float Float 
            | Square Float | Circle Float

area :: Shape -> Float
area (Triangle a b c) = sqrt (s*(s-a)*(s-b)*(s-c))
        where
            s = (a+b+c)/2
area Square d = d*d
area Circle r = pi * r^2
我得到的错误是:

Haskell.hs:4:1:
Equations for `area' have different numbers of arguments
  Haskell.hs:(4,1)-(6,37)
  Haskell.hs:7:1-19
Failed, modules loaded: none.
我看到的解决方案是:

data Shape = Triangle Float Float Float 
   | Square Float | Circle Float 
area :: Shape -> Float 
area ( Triangle a b c ) 
   = triarea a b c 
area ( Square d ) 
   = d * d 
area ( Circle r ) 
   = pi * r^2 

triarea a b c 
   = sqrt( s * (s-a) * (s-b) * (s-c) ) 
     where 
     s = (a+b+c)/2 
这与我的实现有什么不同??我的错误是什么意思

谢谢:

您需要在括号中围绕正方形d和圆圈r。否则,它们将被解析为两个参数,而不是一个

例如,请参见:函数应用程序绑定比任何中缀运算符都要紧密。用火书的形式把它烧进你的大脑。这在这里并不完全相关;相反,函数应用程序是左关联的,即使在定义的左端也是如此。

您需要在括号中围绕正方形d和圆圈r。否则,它们将被解析为两个参数,而不是一个


例如,请参见:函数应用程序绑定比任何中缀运算符都要紧密。用火书的形式把它烧进你的大脑。这在这里并不完全相关;相反,函数应用程序是左关联的,即使在定义的lhs上也是如此。

在模式匹配中,您需要围绕正方形d和圆形r的排列,类似于三角形。这是一个愚蠢的错误,谢谢!!在模式匹配中,您需要围绕正方形d和圆形r的排列,类似于三角形。这是一个愚蠢的错误,谢谢!!