Haskell:嵌套的parens与点符号

时间:2015-01-19 23:13:36

标签: haskell lazy-evaluation function-composition

Euler项目的问题2说: Fibonacci序列中的每个新术语都是通过添加前两个术语生成的。从1和2开始,前10个术语将是:

1,2,3,5,8,13,21,34,55,89,......

通过考虑Fibonacci序列中的值不超过四百万的项,找到偶数项的总和。

GHCi解析这个解决方案很好:

fibs = 0 : 1 : zipWith (+) fibs (tail fibs)
p002fibsum x = sum (filter even (takeWhile (< (x+1)) fibs))

...但是这个问题有一个问题:

fibs = 0 : 1 : zipWith (+) fibs (tail fibs)
p002fibsum x = sum . filter even . takeWhile (< (x+1)) fibs

Couldn't match expected type `a1 -> [c0]' with actual type `[a0]'
In the return type of a call of `takeWhile'
Probable cause: `takeWhile' is applied to too many arguments
In the second argument of `(.)', namely
  `takeWhile (< (x + 1)) fibs'
In the second argument of `(.)', namely
  `filter even . takeWhile (< (x + 1)) fibs'
虽然看起来只有两个参数似乎是合适的数量。我因为缺少类型签名而失败了吗?如何使用点表示法来使用此解决方案?

1 个答案:

答案 0 :(得分:1)

问题是takeWhile (< (x+1)) fibs的类型为[a0](其中a0Num),而函数组合需要第二个参数的函数({{ 1}})。

如果你想使用点符号,那就是

a1 -> [c0]

虽然我宁愿使用美元符号:

p002fibsum x = (sum . filter even . takeWhile (< (x+1))) fibs