【发布时间】:2021-12-24 08:43:01
【问题描述】:
我只是在玩 Haskell 类型类,发现了一个我无法理解的错误。
这是重现它的代码:
fun :: (Num a) => Integer -> a
fun a = a + 1
错误:
Couldn't match expected type ‘a’ with actual type ‘Integer’
现在,据我了解,Integer 是 Num 类型类的instance,Integer 类型满足 Num 定义的所有要求。 这种转换是不允许的吗?这不是使用创建 Typeclass 的重点吗,即 'a' 是 typeclass Num 的任何实例。
【问题讨论】:
-
在 Haskell 中没有隐式转换:
Integer不会自动提升为Double-- 我们需要调用fromInteger来显式转换值。唯一的例外是数字文字:123会自动转换为上下文所需的数字类型,本质上表现得好像用户写了fromInteger (123::Integer)。所有其他表达式(包括变量)都不受这种自动转换的影响。
标签: haskell types type-conversion typeerror