我们定义的bar函数并不是一个加里化的函数。调用bar(5)并不会返回一个可以输入12的函数。我们只能像bar(5,12)这样调用这个函数。

  在一些其它语言里,比如 Haskell 和 OCaml,所有的多参数函数都是通过加里化实现的。

  下面是一个把上面的foo函数用OCaml语言写成的例子:

    let foo = fun a -> 
    
      fun b -> 
        a * a + b * b

  下面是把上面的bar函数用OCaml语言写成的例子:

    let bar = fun a b -> 
    
      a * a + b * b

  头一个函数我们叫做“显式加里化”,第二个叫做“隐式加里化”。

  跟Javascript不一样,在OCaml语言里,foo函数和bar函数是完全一样的。我们用完全一样的方式调用它们。

    # foo 3 4;; 
    - : int = 25
    # bar 3 4;; 
    - : int = 25

  两个函数都能够通过提供一个参数值来创造一个偏函数:

    # let foo5 = foo 5;; 
    val foo5 : int -> int = <fun> 
    
    # let bar5 = bar 5;; 
    val bar5 : int -> int = <fun> 
    # foo5 12;; 
    - : int = 169
    # bar5 12;; 
    - : int = 169

  事实上,我们可以把下面这个匿名函数:

fun arg1 arg2 ... argN -> exp

  当作是下面这个函数的简写:

fun arg1 -> fun arg2 -> ... -> fun argN -> exp

  函数加里化和偏函数应用的总结

  ● 偏函数应用是找一个函数,固定其中的几个参数值,从而得到一个新的函数。

  ● 函数加里化是一种使用匿名单参数函数来实现多参数函数的方法。

  ● 函数加里化能够让你轻松的实现某些偏函数应用。

  ● 有些语言(例如 Haskell,OCaml)所有的多参函数都是在内部通过函数加里化实现的。