(Kestrel) К-комбинатор: защо е полезен?

Наскоро започнах да се занимавам с 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

Може ли някой да ми даде лесен пример за това къде може да се използва това, моля?


person Richiban    schedule 01.10.2014    source източник
comment
:D погледнете това: en.wikipedia.org/wiki/SKI_combinator_calculus - наистина е просто академично забавление - дори и да намерите някои приложения във F#, не трябва да го наричате просто K ^^   -  person Random Dev    schedule 01.10.2014
comment
Между другото, ако не го намерите веднага - K например се използва за прилагане на неща като булеви стойности, кортежи, числа, ... в SKI изчислението (е, това е основен градивен елемент ;) ) - просто мислете за него като за вид проекция към първия компонент   -  person Random Dev    schedule 01.10.2014
comment
Благодаря, прочетох страницата в Уикипедия, но тя не даде повече информация, отколкото вече имах.   -  person Richiban    schedule 01.10.2014
comment
Какво точно искате да знаете (това е огромна тема)   -  person Random Dev    schedule 01.10.2014
comment
K-Combinator става полезен, когато се използва с частично приложение. Създава функция „стартиране отначало“.   -  person Christopher Stevenson    schedule 01.10.2014
comment
Това се нарича "const" или "konst" в повечето системи, вече 80 години. „Ветрушка“ е ужасно име, imo.   -  person Don Stewart    schedule 02.10.2014


Отговори (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 комбинаторът ви позволява да укажете постоянна функция с няколко натискания на клавиши.

person Gus    schedule 01.10.2014
comment
Благодаря, Густаво, това също ми хрумна, такива моменти са, когато бих използвал и id (като lst |> sortBy id), но все още не разбирах смисъла на постоянна функция в карта. Еквивалентният SQL би бил select 5 from dbo.Customers. Може би ще продължа да мисля. - person Richiban; 01.10.2014
comment
Да, това е донякъде еквивалентно в SQL, но във FP можете да композирате функции по такъв начин, че да можете да разделите логиката на оценител на правило и правило. Мислете за правилата като за функции и може да имате просто правило, което не се нуждае от допълнителен параметър. Използвам K комбинатора от време на време в такива случаи, за да избегна повтарянето на собственото си писане fun x -> something - person Gus; 01.10.2014
comment
въпреки че е вярно и е хубав пример в реалната ситуация, разбира се, бихте използвали много по-четливото List.replicate 4 10 (или 10 |> List.replicate 4) - person Random Dev; 01.10.2014
comment
Вярно, или просто напишете [10;10;10;10], но тогава вече не картографирам функции. - person Gus; 01.10.2014
comment
Благодаря ви за приноса, момчета. Предполагам, че причината, поради която наистина се боря, е, че въпреки че чувствам, че разбирам добре езика F#, все още не съм правил много функционално програмиране и никога не съм писал функция като fun x -> something. Ще го получа някой ден :) - person Richiban; 03.10.2014