Quel est le moyen le plus court pour exprimer la fonction
f(a,b)(c,d)=(a+c,b+d)
en notation sans point?
pointfree.io nous donne
uncurry (flip flip snd . (ap .) . flip flip fst . ((.) .) . (. (+)) . flip . (((.) . (,)) .) . (+))
qui avec un peu de travail peut être raccourci
uncurry$(`flip`snd).((<*>).).(`flip`fst).((.).).(.(+)).flip.(((.).(,)).).(+)
pour 76 octets. Mais cela semble encore très long et complexe pour une tâche aussi simple. Existe-t-il un moyen d'exprimer l'addition par paire comme une fonction sans point plus courte?
Pour être clair par ce que j'entends par point-free, une déclaration point-free d'une fonction implique de prendre des fonctions et des opérateurs existants et de les appliquer les uns aux autres de telle sorte que la fonction souhaitée soit créée. Entre parenthèses, et les apostrophes inverses des valeurs littérales ( []
, 0
, [1..3]
, etc.) sont autorisés , mais des mots clés comme where
et let
ne sont pas. Ça signifie:
Vous ne pouvez attribuer aucune variable / fonction
Vous ne pouvez pas utiliser de lambdas
Vous ne pouvez pas importer
(+)***(+)
.
(+)<$>([1],2)<*>([3],4)
donne ([1,3],6)
.