我们如何将不带参数的函数转换为单参数函数?

时间:2019-07-02 20:25:37

标签: design-patterns functional-programming f#

https://www.slideshare.net/ScottWlaschin/fp-patterns-ndc-london2014

  

坏消息:组合模式仅适用于具有一个参数的函数!

     

好消息!每个函数都是一个参数函数!

通过部分应用,我们可以将具有两个参数的函数转换为具有一个参数的函数。例如

let add x y = x + y 
let add x = (fun y -> x + y)

let add1 = (+) 1  
let three = add1 2 

我们如何将不带参数的函数转换为单参数函数?

1 个答案:

答案 0 :(得分:7)

没有参数就没有函数,并且多参数函数也没有进行转换。引言说:“每个函数 都是一个参数函数”。总是只有一个参数,不多也不少。

您可能认为无参数的函数可能是一个采用unit类型的单个参数的函数:

let f () = ...

unit类型只有一个值,()(也称为“单位”),因此它不包含任何信息,但从技术上讲仍然是一个值。您可能会认为它是空元组。

二参数函数实际上是一个具有一个参数的函数,并返回另一个具有另一个参数的函数。请记住,函数是一流的,这意味着它们是可以从函数返回并绑定到变量名称的值。因此,这两种形式是等效的,前者只是后者的语法糖:

let f a b = ...
let f = fun a -> fun b -> ...

三参数函数是一个返回函数的函数,该函数返回一个函数,依此类推。这称为“咖喱”。并且,对于咖喱函数,部分函数应用只是普通函数应用。函数应用程序只是碰巧返回一个函数,而不是其他值。