我是Haskell的新手,我正在尝试创建一个表达式,该表达式给出从0到n的整数列表,这些整数可以被3整除。我编写的脚本无效,我不确定是什么原因。
zeroto :: Int -> [Int]
zeroto n = [x | x <- [0..n]]
where
x "mod" 3 == 0
答案 0 :(得分:8)
where
不能那样工作。它不是过滤器,而是本地作用域的定义。
但是,列表理解确实允许过滤器 ,您只是没有将其放在正确的位置。
zeroto :: Int -> [Int]
zeroto n = [x | x <- [0..n], x `mod` 3 == 0]
或者,您可以在where块中定义过滤器函数,然后再过滤,但这有点愚蠢。
zeroto :: Int -> [Int]
zeroto n = divisibleByThree [0..n]
where divisibleByThree = filter (\x -> x `mod` 3 == 0)
答案 1 :(得分:1)
这不是最好的方法,但是使用简单的递归可以做到
mod3Arr :: Int -> [Int]
mod3Arr 0 = [0]
mod
mod3Arr n | n3 == 0 = smallerArr ++ [n]
| otherwise = smallerArr
where smallerArr = mod3Arr ( n - 1)