Jaki jest najkrótszy sposób na wyrażenie funkcji
f(a,b)(c,d)=(a+c,b+d)
w notacji bez punktów?
pointfree.io daje nam
uncurry (flip flip snd . (ap .) . flip flip fst . ((.) .) . (. (+)) . flip . (((.) . (,)) .) . (+))
które przy odrobinie pracy można skrócić
uncurry$(`flip`snd).((<*>).).(`flip`fst).((.).).(.(+)).flip.(((.).(,)).).(+)
dla 76 bajtów. Ale wciąż wydaje się to naprawdę długie i skomplikowane jak na tak proste zadanie. Czy jest jakiś sposób, aby wyrazić dodawanie parami jako krótszą funkcję bez punktów?
Aby wyjaśnić, co mam na myśli przez określenie „bez punktów”, deklaracja funkcji bez punktów obejmuje przejęcie istniejących funkcji i operatorów i zastosowanie ich względem siebie w taki sposób, aby utworzyć żądaną funkcję. Backticks, nawiasy i wartości literalne ( []
, 0
, [1..3]
, itd) są dozwolone, ale słowa kluczowe, jak where
i let
nie. To znaczy:
Nie możesz przypisywać żadnych zmiennych / funkcji
Nie możesz używać lambdas
Nie możesz importować
(+)***(+)
.
(+)<$>([1],2)<*>([3],4)
daje ([1,3],6)
.