无点表示法,递归和模式匹配

Dwi*_*son 7 haskell pointfree

所以我一直听到很多关于点自由编程的知识,我决定做一个小实验来测试我对它的掌握程度.这涉及采用有针对性的函数来计算数字的阶乘并将其转换为无点形式.我设法做到了,但是无点结果的可读性远远低于尖锐的结果.

-- 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!)是为了便于将函数推理为其他函数的组合.然而,阶乘函数并不是这种推理的最佳候选者.

显然,这个决定是你的.

  • @Dwilson:您可以将模式匹配转换为无点表示法.只要看看`maybe`或`both`这样的函数; 以"要么"为例:你给它两个函数,一个用于'Left`,第二个用于`Right` case,就是这样.实际上,您可以很容易地构造这些函数,因为它们是ADT与其Church编码之间的同构的一部分.列表可能没有这样的功能,但它很容易实现:`listcase [] zf = z; listcase(x:xs)zf = fx xs`. (3认同)
  • @Dwilson:`enum*`函数power haskell的含糖`[1 .. 5]`等枚举语法 (2认同)