嵌套的lambda表达式与Haskell中正常定义的函数之间的区别

时间:2016-05-08 03:45:56

标签: haskell ghci

有人告诉我,Haskell中的每个函数只能有一个形式参数,定义一个带有多个参数的函数只是一个语法糖。这是否意味着可以将多参数函数移植到嵌套的lambda表达式中而不会丢失或获取任何属性?

我认为答案是肯定的。然而,当我真正尝试使用下面的两个函数时,我遇到了一些看起来像诺布眼睛一样神秘的东西。

-- aFile.hs

f x y = x + y

g = \x -> \y -> x + y

我在没有类型注释的文件中定义了fg,期望两个函数的类型都是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的基础是什么?这个结果是否意味着多参数函数定义不是语法糖?

更令人困惑的是,hg相同,但直接输入到REPL中,具有预期的多态类型。 gh有何不同?

0 个答案:

没有答案