Приложение с частичной функцией для несимметричного оператора с использованием точечного стиля в F #?
Как создать приложение частичной функции для несимметричного оператора, такого как оператор модуля, относительно первого аргумента без каких-либо имен аргументов в F #? Моя первая попытка была
let mod10 = (%) 10
, который, конечно, переводится на
mod10(x) = 10 mod x
вместо желаемого
mod10(x) = x mod 10
.
Конечно, я мог написать
let mod10 x = (%)x 10
, но я бы хотел не указывать аргумент, так что есть какой-то заполнитель, который можно использовать, что-то вроде
let mod10 = (%)_ 10
?
Ответы
Ответ 1
Вы можете определить функцию flip
, которая распространена в стиле без точек:
let inline flip f x y = f y x
и используйте его следующим образом:
let (%-) = flip (%)
let mod10 = (%-) 10
или прямо так:
let mod10 = flip (%) 10
Стиль без точек не всегда читается (как в этом примере) и не популярен в программировании на языке F #.
Ответ 2
Здесь решение основано на функциональном составе.
let mod10 = (%) >> (|>) 10
UPD. Здесь было многословное объяснение, но программисты говорят о коде, поэтому я предполагаю, что следующее будет описывать его намного лучше, в виде математических доказательств.
Следующие выражения равны:
let m1 x = x % 10
let m2 x = (%) x 10 // x (op) y = (op) x y
let m3 x = ((%) x) 10 // f x y = (f x) y
let m4 x = 10 |> ((%) x) // f x = x |> f
let m5 x = ((|>) 10) ((%) x) // x |> f = (|>) x f
let m6 x = ((%) x) |> ((|>) 10) // f x = x |> f
let m7 x = (x |> (%)) |> ((|>) 10) // (op) x = x |> (op)
let m8 x = x |> ((%) >> ((|>) 10)) // f(x) |> g = x |> (f >> g)
let m9 = (%) >> ((|>) 10) // remove formal argument
let m10 = (%) >> (|>) 10 // remove unnecessary parenthesis
Альтернативный синтаксис:
let mod10_2 = (|>) 10 << (%)