цитированием Википедии:
комбинатор является функция высшего порядка, который использует только применение функции и ранее определенные комбинаторы для определения результата из своих аргументов.
Что это значит? Это означает, что комбинатор является функцией (выход определяется исключительно его входом), вход которого включает в себя функцию в качестве аргумента.
Как выглядят такие функции и для чего они используются? Вот некоторые примеры:
(f o g)(x) = f(g(x))
Здесь o
является комбинатор, который принимает в 2-х функций, и f
g
, и возвращает функцию в качестве результата, состав f
с g
, а именно f o g
.
Комбинаторы могут использоваться для скрытия логики. Скажем, у нас есть тип данных NumberUndefined
, где NumberUndefined
может принимать числовое значение Num x
или значение Undefined
, где x
a - Number
. Теперь мы хотим построить сложение, вычитание, умножение и деление для этого нового числового типа. Семантика такая же, как для Number
, за исключением случаев, когда Undefined
является входом, выход также должен быть Undefined
, а при делении на номер 0
вывод также Undefined
.
Можно было бы написать утомительный код, как показано ниже:
Undefined +' num = Undefined
num +' Undefined = Undefined
(Num x) +' (Num y) = Num (x + y)
Undefined -' num = Undefined
num -' Undefined = Undefined
(Num x) -' (Num y) = Num (x - y)
Undefined *' num = Undefined
num *' Undefined = Undefined
(Num x) *' (Num y) = Num (x * y)
Undefined /' num = Undefined
num /' Undefined = Undefined
(Num x) /' (Num y) = if y == 0 then Undefined else Num (x/y)
Обратите внимание, как все имеют ту же логику в отношении Undefined
входных значений. Только деление делает немного больше. Решение состоит в том, чтобы извлечь логику, сделав ее комбинатором.
comb (~) Undefined num = Undefined
comb (~) num Undefined = Undefined
comb (~) (Num x) (Num y) = Num (x ~ y)
x +' y = comb (+) x y
x -' y = comb (-) x y
x *' y = comb (*) x y
x /' y = if y == Num 0 then Undefined else comb (/) x y
Это может быть обобщено в так называемой Maybe
монады, что программисты делают использование функциональных языков, как Haskell, но я туда не пойду.
Я надеялся на что-то немного больше вводного чем dreamsongs один. Может быть, с некоторой мотивацией о том, к какой проблеме они обращаются и т. Д. – interstar