作为一名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
最短的代码(以字节为单位)获胜!
您可能会发现blunt有用,它会在两种表示法之间转换(但也可能在可能的情况下分解代码):https : //blunt.herokuapp.com
15
在pointfree符号,我们使用指向一个函数的输出送入另一这显然是企图证明pointfree不是毫无意义的
—
路易斯Mendo
“ Pointfree仅适用于带有单个参数的函数”。这是不正确的:
—
Damien
(+).(*3)
与\x y->3*x+y
@Damien我正在尝试使挑战更容易获得。您还可以做类似owl的事情:
—
BlackCap
(.).(.)
转换为\i b c f -> i (b c f)
因此,对于那些不了解Haskell语法的人来说,为了清楚起见,我们应该:首先在输入中匹配括号,然后在每个顶级括号表达式上递归;然后将每个替换
—
彼得·泰勒
.
为(
,在a之前\x
添加一个,并追加一个所需的数量x
和)
所需数量?还是比这更复杂?
@Linus
—
BlackCap,2016年
\ d->f(\k->f(f d k))
,但您可以假定在此挑战中所有点都被馈以两个参数