【发布时间】:2018-11-02 15:34:31
【问题描述】:
我正在使用 Haskell 进行 Project Euler,并在完成 the very first problem 时发现了一些要学习的东西。这是我的代码:
isValid x = (mod x 3 == 0) || (mod x 5 == 0)
listValid :: Integer -> [Integer]
listValid n = [x | x <- [1..n-1], isValid x]
函数listValid 将获得小于n 且可被3 或5 整除的所有正整数。很简单。
*Main> listValid 10
[3,5,6,9]
现在我需要对它们求和。我认为 sum 函数是正确的方法。我不明白为什么前两个版本可以工作,而第三个版本不行。
*Main> sum (listValid 10)
23
*Main> sum $ listValid 10
23
*Main> sum listValid 10
<interactive>:4:5:
Couldn't match type ‘[Integer]’ with ‘a0 -> t’
Expected type: Integer -> a0 -> t
Actual type: Integer -> [Integer]
Relevant bindings include it :: t (bound at <interactive>:4:1)
In the first argument of ‘sum’, namely ‘listValid’
In the expression: sum listValid 10
这是一个操作顺序问题,我需要用括号括起来以断言应该首先应用哪个函数?如果是这样,$ 在第二个版本中做了什么?
【问题讨论】:
-
“这是一个运算顺序问题,我需要用括号括起来以断言应该首先应用哪个函数?” 是的。 “如果是这样,
$在第二个版本中做了什么?” 就是这样。 :)
标签: function haskell operator-precedence