为什么你可以在haskell中定义没有参数的函数

Ren*_*ene 3 haskell functional-programming partial-application

我有部分应用的函数add来创建一个新函数addOne.

add :: Int -> (Int -> Int)
add x y = x + y
Run Code Online (Sandbox Code Playgroud)

addOne可以使用显式参数定义

addOne :: Int -> Int
addOne y = add 1 y
Run Code Online (Sandbox Code Playgroud)

或没有explict参数

addOne :: Int -> Int
addOne = add 1
Run Code Online (Sandbox Code Playgroud)

我有四个问题:

  1. 为什么我没有显式参数来定义新函数?
  2. 这两个定义之间有什么区别吗?
  3. 我何时知道何时可以在没有参数的情况下定义函数?
  4. 哪个定义更受欢迎?何时?

Tom*_*lis 5

  1. 因为addOne y = add 1 y手段addOne = \y -> add 1 y,而且\x -> f x永远是公正的f.这称为eta等价.所以addOne = add 1.

  2. 没有

  3. 总是.函数参数只是lambdas的语法糖:

    add :: Int -> Int -> Int
    add = \x y -> x + y
    
    Run Code Online (Sandbox Code Playgroud)

    是否可以完全删除变量绑定是另一回事.

  4. "eta reduce"总是很好(也就是说,当它与匹配表达式中的函数应用程序匹配时,删除函数绑定中最右边的绑定变量),因为它可以避免引入多余的名称.

  • 至于问题2,GHC优化器有所不同,但这可能是我们不应该在这里混淆的人. (3认同)