将无点转换为有点


9

作为一名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

1
“ Pointfree仅适用于带有单个参数的函数”。这是不正确的:(+).(*3)\x y->3*x+y
Damien

2
@Damien我正在尝试使挑战更容易获得。您还可以做类似owl的事情:(.).(.)转换为\i b c f -> i (b c f)
BlackCap

2
因此,对于那些不了解Haskell语法的人来说,为了清楚起见,我们应该:首先在输入中匹配括号,然后在每个顶级括号表达式上递归;然后将每个替换.(,在a之前\x添加一个,并追加一个所需的数量x)所需数量?还是比这更复杂?
彼得·泰勒

1
@Linus \ d->f(\k->f(f d k)),但您可以假定在此挑战中所有点都被馈以两个参数
BlackCap,2016年

Answers:


4

Haskell,163142133字节

p(x:r)|[a,b]<-p r=case[x]of"("->["(\\x->"++a++p b!!0,""];"."->['(':a++")",b];")"->[" x)",r];_->[x:a,b]
p r=[r,r]
f s=p('(':s++")")!!0

在Ideone上尝试。

取消高尔夫:

p('(':r)|(a,b)<-p r = ("(\\x->"++a++(fst(p b)),"")
p('.':r)|(a,b)<-p r = ('(':a++")",              b)
p(')':r)            = (" x)",                   r)
p(x  :r)|(a,b)<-p r = (x:a,                     b)
p _                 = ("",                     "")

f s=fst(p('(':s++")"))

2

Haskell中,402个 289字节

相当长的时间,但是我认为它可以工作。

(!)=elem
n%'('=n+1
n%')'=n-1
n%_=n
a?n=a!"."&&n<1
a#n=a!" ("&&n<1||a!")"&&n<2
q a='(':a++")"
p s o n[]=[s]
p s o n(a:b)|o a n=[t|t@(q:r)<-s:p""o(n%a)b]|0<1=p(s++[a])o(n%a)b
k=foldr((++).(++" ").f)"".p""(#)0
f t|not$any(!"(. ")t=t|l@(x:r)<-p""(?)0t=q$"\\x->"++foldr((.q).(++).k)"x"l|0<1=k t
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.