所以我一直听到很多关于点自由编程的知识,我决定做一个小实验来测试我对它的掌握程度.这涉及采用有针对性的函数来计算数字的阶乘并将其转换为无点形式.我设法做到了,但是无点结果的可读性远远低于尖锐的结果.
-- pointed
fact 0 = 1
fact n = n * (fact (n-1))
-- point free
fact' = foldr1 (*) . takeWhile ((<) 0) . iterate (flip (-) 1)
Run Code Online (Sandbox Code Playgroud)
我是否遗漏了指向自由符号所必需的东西,或者这是否可以像某些转换那样可读?对我来说,似乎fact函数的很大一部分是零上的模式匹配,实际上,模式匹配是我喜欢Haskell的最大原因之一.然而,无点符号似乎完全不允许这一点,以及其他一些非常有用的东西,如列表推导.
Joh*_*zen 15
无点形式的规范因子是:
fact = product . enumFromTo 1
Run Code Online (Sandbox Code Playgroud)
(相当于fact n = product [1..n])
我觉得这很可读.但是,我会同意原始版本:
fact 0 = 1
fact n = n * (fact (n-1))
Run Code Online (Sandbox Code Playgroud)
匹配定义非常好,也是可读的.
无点形式的要点(ha!)是为了便于将函数推理为其他函数的组合.然而,阶乘函数并不是这种推理的最佳候选者.
显然,这个决定是你的.