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中的类型?
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)
| 归档时间: |
|
| 查看次数: |
202 次 |
| 最近记录: |