为什么在值构造函数中声明的类型不是Haskell中的类型?

时间:2016-06-14 11:04:22

标签: haskell type-declaration value-constructor

假设我有以下值构造函数:

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中的类型?

1 个答案:

答案 0 :(得分:8)

data Shape = Circle Float Float Float | Rectangle Float Float Float Float

Shape是一个类型(和一个类型构造函数)。 Float是另一种类型。

CircleRectangle是类型Shape的值构造函数。

我猜你的混乱来自OOP子类型 - 请注意Haskell与此类似。上述内容未声明两种类型CircleRectangleShape的子类型。

使用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