(Пустельга) K-комбинатор: почему он полезен?
В последнее время я занимаюсь F# (мой фон-C#) и читаю сайт http://fsharpforfunandprofit.com , что я нахожу очень полезным.
Я должен http://fsharpforfunandprofit.com/posts/defining-functions/, который является разделом о комбинаторах. Я понимаю их всех (хотя Y combinator или Sage bird не дают мне покоя!) за исключением пустельги. Скотт Влашин дает определение (в F#) как:
let K x y = x
Я не могу. поймите для меня на всю жизнь любую ситуацию, в которой это было бы полезно. Сначала я подумал, что его можно использовать как цепной оператор, чтобы можно было передать значение функции, а затем вернуть исходное значение. Я сам писал такой оператор раньше, но, как вы можете видеть, это не одно и то же:
let (>|) x f = f x; x
Если мы частично применим комбинатор K (со значением 5), то получим функцию, которая игнорирует его аргумент и вместо этого возвращает 5. Опять же, бесполезно.
(K 5) = fun y -> 5
Может ли кто-нибудь дайте мне простой пример того, где это может быть использовано, пожалуйста?
1 ответ:
Вот очень простой пример:
Предположим, что у меня есть структура, например список, в котором я могу сопоставлять функции.let K x y = x let lst = [3;5;13;2]
Я могу отобразить математические функции следующим образом:
let plus5 = lst |> List.map ((+)5) // instead of writing List.map (fun x -> 5 + x) // val plus5 : int list = [8; 10; 18; 7] let times3 = lst |> List.map ((*)3) // instead of writing List.map (fun x -> 3 * x) // val times3 : int list = [9; 15; 39; 6]
Что делать, если я хочу отобразить постоянную функцию?
let tens = lst |> List.map (K 10) // instead of writing List.map (fun x -> 10) // val tens : int list = [10; 10; 10; 10]
Учитывая, что в FP вы обычно передаете функции в качестве аргументов, комбинатор K позволяет указать постоянную функцию с помощью нескольких нажатий клавиш.