2014-12-27 26 views
4

我有以下功能:没有实例(NUM(INT - >智力)),从字面'5' 产生

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

现在我想打电话给f5(这是不正确的):

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出现在这里?

+0

函数的主体是什么? – Shoe

+1

@J无所谓。增加了“未定义”。 – ZhekaKozlov

回答

12

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

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

从技术上讲,文字代表fromInteger 5,其中5Integer常数。致电f 5因此实际上是f (fromInteger 5),它试图将五个转换为Int -> Int。这需要Num (Int -> Int)的实例。

因此,GHC不会在其错误指出5不能是一个函数(因为它可能,如果用户宣布它这样,提供一个合适的fromInteger)。它只是正确地指出,对于整数函数,找不到Num实例。

+2

我不同意这个答案,特别是在“正确”的部分。 '5'也是'Show'的一个实例。为什么不失败:“没有实例(Show(Int - > Int))”? – Shoe

+0

@Jefffrey对,我会在imprint“fromInteger”上添加一些内容。 – chi

+2

@Jefffrey因为演出与它无关。如果'Int - > Int'是'Num'的一个实例,那意味着'5'可以是'Int-> Int'类型(因为5可以是任何类型的'Num'的实例)。如果'Int - > Int'是'Show'的一个实例,那么这并不意味着这一点,因此没有理由为什么会出现在错误信息中。 – sepp2k

相关问题