繁体   English   中英

Haskell:嵌套的括号与点表示法

[英]Haskell: nested parens vs. dot notation

欧拉计划的问题2说:斐波那契数列中的每个新术语都是通过将前两个术语相加而生成的。 从1和2开始,前10个术语将是:

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

通过考虑斐波那契数列中值不超过四百万的项,找到偶值项的总和。

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'

takeWhile似乎只接受两个参数,这似乎是正确的数量。 我是否由于缺少类型签名而失败? 如何获得此解决方案以使用点符号?

问题在于, takeWhile (< (x+1)) fibs的类型为[a0] (其中a0是一些Num ),而函数组成期望其第二个参数为函数( a1 -> [c0] )。

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

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

尽管我宁愿使用美元符号:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM