我有以下功能:
f :: (Int -> Int) -> Int
f = undefined
现在我想用f
(不正确)致电5
:
f 5
显然,这不应该编译,因为5
不是Int
到Int
的函数。
所以我希望会出现Couldn't match expected type Int -> Int with Int
等错误消息。
但我得到了:
No instance for (Num (Int -> Int)) arising from the literal `5'
In the first argument of `f', namely `5'
In the expression: f 5
In an equation for `it': it = f 5
为什么Num
出现在这里?
答案 0 :(得分:12)
5
是类型类Num
中的任何类型。这些类型包括Int
,Double
,Integer
等
默认情况下,函数不在类型类Num
中。然而,用户可以添加用于功能的Num
实例,例如,以逐点方式定义两个函数的总和。在这种情况下,文字5
可以代表常数五功能。
从技术上讲,文字代表fromInteger 5
,其中5
是Integer
常量。因此,调用f 5
实际上是f (fromInteger 5)
,它会尝试将五个转换为Int -> Int
。这需要Num (Int -> Int)
。
因此,GHC没有在错误中声明5
不能成为一个函数(因为可能,如果用户声明它,那么提供一个合适的fromInteger
})。它只是正确地指出,没有为整数函数找到Num
实例。