为什么在值构造函数中声明的类型不是 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 because“Circle
不是类型,Shape
是
我的问题是:为什么在值构造函数中声明的类型不是 Haskell 中的类型?
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
假设我有以下值构造函数:
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 中的类型?
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