有人告诉我,Haskell中的每个函数只能有一个形式参数,定义一个带有多个参数的函数只是一个语法糖。这是否意味着可以将多参数函数移植到嵌套的lambda表达式中而不会丢失或获取任何属性?
我认为答案是肯定的。然而,当我真正尝试使用下面的两个函数时,我遇到了一些看起来像诺布眼睛一样神秘的东西。
-- aFile.hs
f x y = x + y
g = \x -> \y -> x + y
我在没有类型注释的文件中定义了f
和g
,期望两个函数的类型都是Num a => a -> a -> a
。然而,实际结果令人费解:
Prelude> :load aFile.hs
Ok, modules loaded: Main.
*Main> :type f
f :: Num a => a -> a -> a
*Main> :type g
g :: Integer -> Integer -> Integer
*Main> let h = \x -> \y -> x + y
*Main> :type h
h :: Num a => a -> a -> a
不知何故g
不是多态的。在这里推断Integer
的基础是什么?这个结果是否意味着多参数函数定义不是语法糖?
更令人困惑的是,h
与g
相同,但直接输入到REPL中,具有预期的多态类型。 g
和h
有何不同?