在haskell

时间:2018-10-31 20:28:03

标签: haskell

我是Haskell的新手,我正在尝试创建一个表达式,该表达式给出从0到n的整数列表,这些整数可以被3整除。我编写的脚本无效,我不确定是什么原因。

zeroto :: Int -> [Int]
zeroto n = [x | x <- [0..n]]
           where
             x "mod" 3 == 0

2 个答案:

答案 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]
mod3Arr n | n
mod 3 == 0 = smallerArr ++ [n] | otherwise = smallerArr where smallerArr = mod3Arr ( n - 1)