ash*_*osh 3 haskell functional-programming
我正在阅读《第一原则》中的 Haskell 编程这本书,并遇到了以下代码片段。
Prelude> fifteen = 15
Prelude> :t fifteen
fifteen :: Num a => a
Prelude> fifteenInt = fifteen :: Int
Prelude> fifteenDouble = fifteen :: Double
Prelude> :t fifteenInt
fifteenInt :: Int
Prelude> :t fifteenDouble
fifteenInt :: Double
Run Code Online (Sandbox Code Playgroud)
这里,Num是类型类,类似于 OO 语言中的基类。我的意思是当我写一个多态函数时,我取了一个受Num类型类约束的类型变量。但是,如上所示,铸造为或作品。它不等同于 OO 语言中的向下转换吗?fifteenIntDouble
Double我是否需要更多信息(在这种情况下是一组特定于类型的函数)才能做到这一点?
谢谢你的协助。
不,这不是等价的。OO 中的向下转换是一个运行时操作:您有一个您不知道其具体类型的值,并且您基本上断言它有一些特殊情况——如果它碰巧实际上是不同的具体类型,这是一个错误。
在 Haskell 中,::根本不是真正的运算符。它只是在编译时向类型检查器添加额外信息。即,如果它完全编译,您始终可以确保它在运行时实际工作。
它在所有工作的原因是,fifteen有没有具体的类型。它就像面向对象语言中的模板/泛型。所以,当你添加:: Double约束,编译器可以再选择什么类型的实例化的a。并且Double可以,因为它是Num typeclass的成员,但不要将 typeclass 与 OO 类混淆:OO 类指定一种具体类型,但它可能具有子类型。在 Haskell 中,子类型不存在,类更像是面向对象语言中的接口。您还可以将类型类视为一组类型,并且fifteen可能具有Num班级; 可以通过签名选择实际使用其中的哪一个。
| 归档时间: |
|
| 查看次数: |
75 次 |
| 最近记录: |