在Haskell中使用concat和map实现过滤器

Mar*_*ala 0 haskell functional-programming

filter1 :: (a -> Bool) -> [a] -> [a]
filter1 p = concat.map box
              where box x
                    | p x       = [x]
                    | otherwise = []
Run Code Online (Sandbox Code Playgroud)

我不明白这个解决方案.map将box应用于列表的所有元素,如果px == True,它将元素放在单个元素的列表中,然后concat取消所有内容?concat在最后还是一个一个地统一一切?

谢谢!我希望有人理解这一点

Fyo*_*kin 6

很难从你的问题中辨别出你实际要问的是什么.请尝试清楚地表达您的问题.我将解释这个函数是如何工作的,并希望这个解释可以解决你实际要问的问题.


首先,map box应用于输入列表.对于那些满足谓词的人,每次调用box都会返回; 或者一个空列表,用于那些不满足谓词的人.因此,结果将是空列表和单例列表的列表.[x]xpxmap box

让我们考虑一个例子.让我们说:

input_list = [1,2,3,4,5]
p = odd
Run Code Online (Sandbox Code Playgroud)

然后:

map box input_list = [ [1], [], [3], [], [5] ]
Run Code Online (Sandbox Code Playgroud)

第一个元素1被映射到[1],因为p 1 == True.第二个元素2被映射到[],因为p 2 == False.等等.

之后,concat将应用于此列表列表.它将所有这些小清单连接成一个大清单.所以在我们的例子中:

concat [ [1], [], [3], [], [5] ] = [1] ++ [] ++ [3] ++ [] ++ [5] = [1,3,5]
Run Code Online (Sandbox Code Playgroud)