我有以下匿名功能:
*Exercises> g = \(Sum n) -> Sum (n - 1)
我用它像:
*Exercises> g (Sum 56)
Sum {getSum = 55}
*Exercises> g 56
Sum {getSum = 55}
第二个例子,编译器如何将56
转换为Sum 56
?
在序言中,我看到Sum
是Num
的一个实例,但不清楚转换。
答案 0 :(得分:8)
当Haskell看到56
之类的整数文字时,它会将其解释为fromInteger 56
。 fromInteger
的类型为Num a => Integer -> a
,因此此代码的类型为Num a => a
。 (任何类型,此处称为a
,它是Num
类的成员。)
这意味着当您在需要Num
成员的上下文中使用它时(在您的情况下为Sum
),它会将“a
”设置为Sum
},然后选择fromInteger
类型的Integer -> Sum
版本。因此fromInteger 56 :: Sum
。