为什么隐式参数在F#中不被视为编译器错误

时间:2015-03-02 06:39:11

标签: f# functional-programming currying

我对函数式编程有点新意,虽然我对F#有点熟悉,但我仍然在学习所有奇怪的工作方式。

//I love my Rice and Curry'd functions

let add x  = 
   let subFunction y = 
      x + y                   
   subFunction    

//explicit parameter
let add1 y = add 1 y

//implicit parameter 
let add10 = add 10

//calling it with the parameter it doesn't show that it takes
let twenty = add10 10

所以这里add10有隐式参数,因为它调用的函数返回一个带参数的函数。为什么我可以接受这种方式而不是像我声明的那样声明add1?

从它的声明判断它真的具有欺骗性,人们会认为它只是一个int。

1 个答案:

答案 0 :(得分:6)

这是来自lambda演算的一些名为eta-reduction

的东西

基本上,这意味着你可以通过消除表达式两边的最后一个参数来简化你的函数/ lambda:

// instead of
let f x y = x + y

// in F# you can write
let f x y = (+) x y

// which is also the same as
let f x y = ((+) x) y

// then you can remove y
let f x   = (+) x

// and then remove x
let f     = (+)

在F#中,只要您没有到达value restriction,就可以使用此功能。因此,在您的代码中,let add1 y = add 1 ylet add10 = add 10是等效的。这是一个示例,说明如何应用逻辑来推理代码,并应用于重构。