假设我有以下值构造函数:
data Shape = Circle Float Float Float | Rectangle Float Float Float Float
现在我可以跑了:
ghci> :t Circle
Circle :: Float -> Float -> Float -> Shape
现在我可以写一个类型声明
surface :: Shape -> Float
但我无法输入类型声明
surface :: Circle -> Float
此is because" Circle
不是类型,Shape
是"
我的问题是:为什么在值构造函数中声明的类型不是Haskell中的类型?
答案 0 :(得分:8)
data Shape = Circle Float Float Float | Rectangle Float Float Float Float
Shape
是一个类型(和一个类型构造函数)。 Float
是另一种类型。
Circle
和Rectangle
是类型Shape
的值构造函数。
我猜你的混乱来自OOP子类型 - 请注意Haskell与此类似。上述内容未声明两种类型Circle
和Rectangle
为Shape
的子类型。
使用GADTs
之类的高级扩展,您实际上可以编写类似foo :: Circle -> Float
的内容,这意味着该参数是Shape
值,已构造为Circle
。这需要一些类型级技术。
或者,简单的Haskell方法可能是
data Circle = Circle Float Float Float
data Rectangle = Rectangle Float Float Float Float
data Shape = Scircle Circle | Srectangle Rectangle