1

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

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

是因为Circle不是类型,Shape是”

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

4

1 回答 1

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

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

Circle并且Rectangle是 type 的值构造函数Shape

我猜你的困惑来自于 OOP 子类型——请注意 Haskell 没有类似的东西。上面没有声明两种类型Circle并且RectangleShape.

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
于 2016-06-14T11:14:57.350 回答