Функция, която прави некъри къри (без използване на ramda библиотека)

Аз съм начинаещ в Ocaml и искам да направя uncurried функция curried.

например,

let add (x,y) = x + y

Това е форма без къри и искам да направя функция, наречена "къри", като

let inc = curry(add)(1)
let ret = inc(2)

Ако приложим моето собствено "къри", то може да се приложи частично.

Тъй като за първи път използвам Ocaml, просто си помислих да извлека записи от кортежа във функцията за добавяне (доста глупаво...) като

let get_1_2 (a,_) = a
let get_2_2 (_,a) = a

let curry f tp = function
    f (get_1_2 tp) (get_2_2 tp)

Но знам, че изобщо няма смисъл...
И така, как да започна?


person Community    schedule 02.05.2019    source източник


Отговори (1)


Понякога е по-лесно да опитате няколко примера, преди да преминете към общия случай. Например, в случай на функцията за добавяне, започвате от

let add (x,y) = x + y

и искате да отидете на

let add2 x y = x + y

В този случай можете да видите, че дясната страна на новата карирана функция е същата като дясната страна на старата функция за добавяне. По този начин можете да пренапишете къри функцията като

let add2 x y = add (x,y)

Ако преминете към умножение, можем да направим същата трансформация от

let mult (x,y) = x * y

to

let mult2 x y = mult (x,y)

Сега, ако сравните нашите две къри функции

let mult2 x y = mult (x,y)
let  add2 x y  =  add (x,y)

Дясната страна изглежда доста сходна: те се различават само по името на функцията, която се извиква на двата аргумента. Ако искаме да обобщим двете функции, едно решение е да предоставим функцията mult или add като аргумент на нова функция. Нека го наречем f за сега:

 let f mult_or_add x y = mult_or_add(x,y)

тогава можем да пренапишем mult2 и add2 като

let mult2 x y = f mult x y
let  add2 x y = f  add x y

Следващата стъпка е да отбележим, че x и y се появяват на една и съща позиция от дясната и лявата страна на новата дефиниция на mult2 и add2, това означава, че можем да ги премахнем

let mult2 = f mult
let  add2 = f  add

Това означава, че нашата функция f преобразува функция, приемаща двойка аргументи, във функция, която приема два аргумента. С други думи, f може да се нарече по-добре curry2:

let curry2 f x y = f (x,y)

Последващо упражнение може да бъде да опитате да напишете функция curry3 или uncurry2.

person octachron    schedule 02.05.2019