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

haw*_*eye 1 haskell type-declaration value-constructor

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

data Shape = Circle Float Float Float | Rectangle Float Float Float Float
Run Code Online (Sandbox Code Playgroud)

现在我可以运行:

ghci> :t Circle
Circle :: Float -> Float -> Float -> Shape
Run Code Online (Sandbox Code Playgroud)

现在我可以写一个类型声明了

surface :: Shape -> Float
Run Code Online (Sandbox Code Playgroud)

但我无法输入类型声明

surface :: Circle -> Float
Run Code Online (Sandbox Code Playgroud)

是因为 " Circle不是一种类型,Shape是"

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

chi*_*chi 8

data Shape = Circle Float Float Float | Rectangle Float Float Float Float
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)