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在最后还是一个一个地统一一切?
谢谢!我希望有人理解这一点
很难从你的问题中辨别出你实际要问的是什么.请尝试清楚地表达您的问题.我将解释这个函数是如何工作的,并希望这个解释可以解决你实际要问的问题.
首先,map box
应用于输入列表.对于那些满足谓词的人,每次调用box
都会返回; 或者一个空列表,用于那些不满足谓词的人.因此,结果将是空列表和单例列表的列表.[x]
x
p
x
map 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)