没有(Num(Int - > Int))的实例来自文字“5”

时间:2014-12-27 21:24:29

标签: haskell

我有以下功能:

f :: (Int -> Int) -> Int
f = undefined

现在我想用f(不正确)致电5

f 5

显然,这不应该编译,因为5不是IntInt的函数。 所以我希望会出现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出现在这里?

1 个答案:

答案 0 :(得分:12)

5是类型类Num中的任何类型。这些类型包括IntDoubleInteger

默认情况下,函数不在类型类Num 。然而,用户可以添加用于功能的Num实例,例如,以逐点方式定义两个函数的总和。在这种情况下,文字5可以代表常数五功能。

从技术上讲,文字代表fromInteger 5,其中5Integer常量。因此,调用f 5实际上是f (fromInteger 5),它会尝试将五个转换为Int -> Int。这需要Num (Int -> Int)

的实例

因此,GHC没有在错误中声明5不能成为一个函数(因为可能,如果用户声明它,那么提供一个合适的fromInteger })。它只是正确地指出,没有为整数函数找到Num实例。