一种简单啰嗦的强行point-free的方法

2016 年 8 月 10 日

最近做codewars上的Haskell的水题的时候(难题我也不会),基本上是尽量用一种point-free的风格(https://en.wikipedia.org/wiki/Tacit_programming)去写的。我个人理解也就是函数的实现不写出参数,只通过curry和组合等来实现,例如:

另外这里也不认可出现用lambda形式代入参数如:

这里用一个生成的方法来实现一个比较通用的方案,其实应该也可以用haskell的point-free风格代码来实现这套代码而不是生成,这里用Ruby生成。

注意到:

也可以写成

每次多一个参数就会是最里面多一个

等等的结构,也就是组合前面是一个(a .)的形式

 

另外,如果我们把tuple视为栈

于是这样就可以实现一组DSL(https://github.com/Artoria/pf-builder)了,比如海伦公式的实现

heron a b c = let s = (a + b + c) / 2 in s * (s – a) * (s – b) * (s – c)

下面的思路是通过build生成函数体

首先把三个参数a b c转成[c, b, a]

然后应用 (/2) . sum得到s

然后把s变成(s-), map到[c, b, a]上,变成[s-c, s-b, s-a], 然后对他它用product, 并且乘上这个积和s

就是结果

得到的结果,反正就是不能看了:

另外,因为point-free的函数也是函数,可以嵌套

比如fib n = foldr (\_ (x, y) -> (y, x+y)) (1, 0) [1..n]

得到的结果