函数参数是如何定义的?

blu*_*sky 1 haskell currying

对于这个功能:

plus1 = (+) 1
Run Code Online (Sandbox Code Playgroud)

我可以用 :

Prelude> plus1 3
4
Run Code Online (Sandbox Code Playgroud)

plus1的类型是

plus1 :: Integer -> Integer
Run Code Online (Sandbox Code Playgroud)

如何在这里允许函数参数Integer?在我的函数定义中,定义了Integer函数参数?

我不确定我期望发生什么,但是来自Java,所有参数都需要被定义为方法的一部分,但这里似乎有一些事情在幕后发生?

sep*_*p2k 8

(如果我们Num暂时忽略类型类并且假设+ Integer仅仅为了简单起见而在s上工作),(+)则是类型的函数Integer -> (Integer -> Integer)(括号不是必需的,因为它->是右关联的,但我为了清楚起见添加了它们).这意味着它接受一个类型的参数,Integer并生成一个类型的函数Integer -> Integer作为其结果.

因此,当您应用于(+)Integer时1,您确实会获得该类型的函数作为结果.由于add1保持结果,因此它是类型的函数,Integer -> Integer这就是为什么你可以应用它plus1 3.

  • +1,很难理解currying但是如果你知道Java/Javascript,你需要把`add`想象成`function add(o1){return function(o2){return o1 + o2; `,并将其称为`add(1)(2)`.那么应该清楚`add(1)`究竟是什么. (3认同)