Почему неявные параметры не считаются ошибками компилятора в 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
эквивалентны. Это пример того, как вы можете применить логику к своему коду, применяя его к рефакторингу.