Будучи хакером на Haskell, я предпочитаю бессмысленную нотацию над точечной. К сожалению, некоторые люди считают, что бессмысленные нотации трудно читать, и мне трудно получить правильное количество скобок, когда я пишу точечно. Помогите мне преобразовать код, написанный в pointfree, в точечную запись!
Около
В нотации без точек мы используем точки (да, действительно) для передачи вывода одной функции в другую. Скажем, если у вас была функция, succ
которая берет число и добавляет к нему 1, и вы хотели создать функцию, которая добавляет 3 к числу, вместо того, чтобы делать это:
\x -> succ(succ(succ(x)))
Вы могли бы сделать это:
succ.succ.succ
Однако Pointfree работает только с функциями, которые принимают один параметр (в любом случае, в этой задаче), поэтому, если бы наша функция не была, succ
а вместо add
этого принимала 2 числа и складывала их вместе, нам пришлось бы передавать аргументы до тех пор, пока не останется только один:
pointful: \x -> add 1(add 1(add 1 x))
pointfree: add 1 . add 1 . add 1
Наконец, функции могут принимать другие функции в качестве аргументов:
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))
Ввод и ожидаемый результат
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)))
правила
- Ваш вывод может иметь больше пробелов или скобок, чем требуется, если они сбалансированы
- Вам не нужно следить за тем, чтобы имя создаваемой переменной
\x
не использовалось где-либо еще в коде. - Это ваш выбор: создать функцию или полную программу
- Это
codegolf
самый короткий код в байтах!
Вы можете найти тупым полезным, он конвертирует между двумя нотациями (но также по возможности разлагает код): https://blunt.herokuapp.com
(+).(*3)
же, как\x y->3*x+y
(.).(.)
которая преобразуется в\i b c f -> i (b c f)
.
на a(
, добавить a\x
и добавить соответствующееx
и столько,)
сколько требуется? Или это сложнее, чем это?\ d->f(\k->f(f d k))
, но вы можете предположить, что в этомОтветы:
Haskell,
163 142133 байтаПопробуйте это на Ideone.
Ungolfed:
источник
Haskell,
402289 байтДовольно долго, но я думаю, что это работает ..
источник