Qual é a maneira mais curta de expressar a função
f(a,b)(c,d)=(a+c,b+d)
em notação sem ponto?
pointfree.io nos dá
uncurry (flip flip snd . (ap .) . flip flip fst . ((.) .) . (. (+)) . flip . (((.) . (,)) .) . (+))
que com um pouco de trabalho pode ser reduzido para
uncurry$(`flip`snd).((<*>).).(`flip`fst).((.).).(.(+)).flip.(((.).(,)).).(+)
por 76 bytes. Mas isso ainda parece muito longo e complexo para uma tarefa tão simples. Existe alguma maneira de expressar a adição aos pares como uma função sem pontos mais curta?
Para ficar claro com o que quero dizer com sem ponto, uma declaração sem ponto de uma função envolve pegar funções e operadores existentes e aplicá-los um ao outro de modo que a função desejada seja criada. Acentos graves, parênteses e valores literais ( []
, 0
, [1..3]
, etc) são permitidos, mas palavras-chave como where
e let
não são. Isso significa:
Você não pode atribuir nenhuma variável / função
Você não pode usar lambdas
Você não pode importar
(+)***(+)
.
(+)<$>([1],2)<*>([3],4)
dá ([1,3],6)
.