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

Why are types declared in value constructors not types in Haskell?

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

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 becauseCircle不是类型,Shape

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

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