Sendo um hacker Haskell, prefiro notação sem ponto a ponto. Infelizmente, algumas pessoas acham difícil ler a notação sem ponto, e acho difícil obter o número correto de parênteses quando escrevo em questão. Ajude-me a converter o código escrito em notação sem ponto para notação significativa!
Sobre
Na notação sem ponto, usamos pontos (sim, realmente) para alimentar a saída de uma função em outra. Digamos, se você tivesse uma função succ
que pega um número e adiciona 1 a ele, e desejava criar uma função que adiciona 3 a um número, em vez de fazer isso:
\x -> succ(succ(succ(x)))
você poderia fazer isso:
succ.succ.succ
No entanto, o Pointfree funciona apenas com funções que usam um único parâmetro (nesse desafio, de qualquer forma); portanto, se nossa função não fosse, succ
mas add
que pegasse 2 números e os adicionasse, teríamos que alimentar argumentos até restar apenas um:
pointful: \x -> add 1(add 1(add 1 x))
pointfree: add 1 . add 1 . add 1
Por fim, funções podem assumir outras funções como argumentos:
Pointfree: map (f a . f b) . id
Pointful: \x -> map (\x -> f a (f b x)) (id x)
Javascript equivalent: x => map (x => f(a,f(b,x)), id(x))
Entrada e saída esperada
f . f . f
\x -> f (f (f x))
f a . f b . f c
\x -> f a (f b (f c x))
f (f a . f b) . f c
\x -> f (\x -> f a (f b x)) (f c x)
a b c . d e . f g h i . j k l . m
\x -> a b c (d e (f g h i (j k l (m x))))
a.b(c.d)e.f g(h)(i j.k).l(m(n.o).p)
\x->a(b(\y->c(d y))e(f g h(\z->i j(k z))(l(\q->m(\w->n(o w))(p q))x)))
Regras
- Sua saída pode ter mais espaços ou parênteses do que o necessário, desde que equilibrados
- Você não precisa se certificar de que o nome da variável que você cria
\x
ainda não esteja sendo usado em outro lugar no código - É sua escolha criar uma função ou um programa completo
- Isto é
codegolf
, o código mais curto em bytes ganha!
Você pode achar útil, mas ele converte entre as duas notações (mas também fatora o código quando possível): https://blunt.herokuapp.com
(+).(*3)
é o mesmo que\x y->3*x+y
(.).(.)
que se converte em\i b c f -> i (b c f)
.
um por um (
, \x
acrescente um a e anexe um correspondente x
e quantos )
forem necessários? Ou é mais complicado que isso?
\ d->f(\k->f(f d k))
, mas você pode assumir que todos os pontos são alimentados dois argumentos neste desafio