Почему неявные параметры не считаются ошибками компилятора в F#

Я немного новичок в функциональном программировании, и хотя я немного знаком с 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 ответ

Решение

Это то, что исходит из лямбда-исчисления под названием Eta-Reduction

По сути, это означает, что вы можете упростить вашу функцию / лямбду, исключив последний параметр с обеих сторон выражения, когда они одинаковы:

// 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# вы можете играть с этим до тех пор, пока не достигнете ограничения по значению. Так в вашем коде let add1 y = add 1 y а также let add10 = add 10 эквивалентны. Это пример того, как вы можете применить логику к своему коду, применяя его к рефакторингу.

Другие вопросы по тегам