Haskell过滤从列表到子列表的3的倍数

时间:2016-04-12 15:58:11

标签: list haskell filter sublist

我仍在尝试掌握Haskell和Functional Programming的工作方式,我需要帮助理解为什么我的函数不起作用。我正在尝试创建一个函数,该函数将整数列表作为参数,并过滤掉/返回一个子列表,该子列表包含第一个列表中的任何3的倍数。这是我的代码:

module Main where

sublist = []

myFunc :: [Int] -> [Int]

myFunc [] = []

myFunc [t] = do
    if t `mod` 3 == 0
        then t : sublist
    else myFunc []

myFunc (h:t) = do
    if h `mod` 3 /= 0
        then myFunc t
        else do
            h : sublist
            myFunc t

这只返回一个包含传递给函数的最后一个值的列表,仍然是sublist = []。感谢您提前给我的任何建议。

1 个答案:

答案 0 :(得分:2)

我认为你需要先从心理上切换到功能风格。

例如,这是从列表中获取偶数

> filter even [1..10]
[2,4,6,8,10]

不使用现有功能,您可以实现相同的功能

filter' :: (a -> Bool) -> [a] -> [a]
filter' _ [] = []
filter' condition (x:xs) = if condition x
                              then x : filter' condition xs
                              else     filter' condition xs

divisibleBy3 n = mod n 3 == 0

现在,您的程序可以写成

filter' divisibleBy3 inputList