Was ist der kürzeste Weg, um die Funktion auszudrücken
f(a,b)(c,d)=(a+c,b+d)
in punktloser Notation?
pointfree.io gibt uns
uncurry (flip flip snd . (ap .) . flip flip fst . ((.) .) . (. (+)) . flip . (((.) . (,)) .) . (+))
was mit ein wenig arbeit gekürzt werden kann
uncurry$(`flip`snd).((<*>).).(`flip`fst).((.).).(.(+)).flip.(((.).(,)).).(+)
für 76 Bytes. Aber für eine so einfache Aufgabe scheint das immer noch sehr lang und komplex zu sein. Gibt es eine Möglichkeit, die paarweise Addition als kürzere punktfreie Funktion auszudrücken?
Um klar zu sein, was ich unter Punktfrei verstehe, bedeutet eine Punktfreie Deklaration einer Funktion, dass vorhandene Funktionen und Operatoren so übernommen und aufeinander angewendet werden, dass die gewünschte Funktion erstellt wird. Backticks, Klammern und Literalwerte ( []
, 0
, [1..3]
, usw.) sind erlaubt , aber Schlüsselwörter wie where
und let
sind es nicht. Das heisst:
Sie dürfen keine Variablen / Funktionen zuweisen
Sie dürfen keine Lambdas verwenden
Sie dürfen nicht importieren
(+)***(+)
.
(+)<$>([1],2)<*>([3],4)
gibt ([1,3],6)
.