Давайте посмотрим на более общую версию, которая использует три функции f
, g
и h
:
func a b c = f a (g b (h c))
В нашем случае, f = (:)
, g = (:)
и h = return
, но мы можем использовать это для любой тройки функций, которые следуют по той же схеме:
func a b c = (f a . g b . h) c
Для следующего шага, написать первое приложение (.)
в виде префикса, так что легче сочетать (.) (f a)
, а остальные позже:
func a b = (.) (f a) (g b . h)
= (.) (f a) (g b . h)
= (.) (f a) ((.) (g b) h)
= (.) (f a) (flip (.) h (g b))
= (.) (f a) ((flip (.) h . g) b)
= (.) (f a) . (flip (.) h . g) b
Теперь мы можем сделать то же самое для a
:
func a = (.) (f a) . (flip (.) h . g)
= (.) ((.) (f a)) (flip (.) h . g)
= flip (.) (flip (.) h . g) ((.) (f a))
= flip (.) (flip (.) h . g) . (.) (f a)
= flip (.) (flip (.) h . g) . (.) . f a
flip (.) x
Поскольку это (.x)
мы можем избавиться от flip
:
func = flip (.) (flip (.) h . g) . (.) . f
= flip (.) ((.h) . g) . (.) . f
= (.((.h) . g)) . (.) . f
Все, что нужно сделать сейчас, чтобы вставить определения f
, g
и h
:
func = (.((.return) . (:))) . (.) . (:)
Я не проверял, есть ли более короткий вариант, но так как это тот же самый результат поскольку pointfree.io дает, он должен быть более или менее оптимальным.
Это, как говорится, если вы сравните
addToList = (.((.return) . (:))) . (.) . (:)
с
addToList a b c = [a, b, c]
, который бы вы хотели прочитать в три месяца?
Вы можете просто использовать [pointfree.io] (http://pointfree.io/), который дает: 'addToList = (. ((. Return). (:))). (.). (:) ' – Bakuriu
И это намного яснее, чем' addToList a b c = [a, b, c] '. \*вздох\* – Zeta