表达功能的最短方法是什么
f(a,b)(c,d)=(a+c,b+d)
用无点表示法?
pointfree.io给了我们
uncurry (flip flip snd . (ap .) . flip flip fst . ((.) .) . (. (+)) . flip . (((.) . (,)) .) . (+))
只需一点点工作就可以缩短到
uncurry$(`flip`snd).((<*>).).(`flip`fst).((.).).(.(+)).flip.(((.).(,)).).(+)
为76个字节。但这似乎还是真的对于如此简单的任务来说漫长而复杂。有什么方法可以将成对加法表示为较短的无点函数?
为了清楚理解我所说的无点,函数的无点声明涉及获取现有函数和运算符,并以创建所需函数的方式将它们相互应用。反引号,括号内文字值([]
,0
,[1..3]
等)允许的,但像关键字where
和let
不是。这表示:
您不得分配任何变量/功能
您不得使用lambda
您可能无法导入
(+)***(+)
。
(+)<$>([1],2)<*>([3],4)
给([1,3],6)
。