Qual è il modo più breve in cui possiamo esprimere la funzione
f(a,b)(c,d)=(a+c,b+d)
in notazione senza punti?
pointfree.io ci dà
uncurry (flip flip snd . (ap .) . flip flip fst . ((.) .) . (. (+)) . flip . (((.) . (,)) .) . (+))
che con un po 'di lavoro può essere abbreviato
uncurry$(`flip`snd).((<*>).).(`flip`fst).((.).).(.(+)).flip.(((.).(,)).).(+)
per 76 byte. Ma questo sembra ancora molto lungo e complesso per un compito così semplice. Esiste un modo per esprimere l'aggiunta a coppie come una funzione senza punti più breve?
Per essere chiari con ciò che intendo dire senza punto, una dichiarazione senza punto di una funzione implica prendere funzioni e operatori esistenti e applicarli l'uno all'altro in modo tale da creare la funzione desiderata. Apici inversi, parentesi e valori letterali ( []
, 0
, [1..3]
, etc.) sono ammessi, ma parole chiave come where
elet
non lo sono. Questo significa:
Non è possibile assegnare variabili / funzioni
Non puoi usare lambdas
Non è possibile importare
(+)***(+)
.
(+)<$>([1],2)<*>([3],4)
dà ([1,3],6)
.