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