and*_*and 5 haskell list filter
我知道Haskell的过滤器是一个高阶函数(意味着一个函数,它接受另一个函数作为参数),它通过一个列表检查哪个元素满足某个布尔条件.
我不太明白它的定义:
filter:: (a->Bool)->[a]->[a]
filter p [] = []
filter p (x:y) | p x = x:filter p y
| otherwise = filter p y
Run Code Online (Sandbox Code Playgroud)
我知道如果我将一个空列表传递给该函数,它只会返回一个空列表,但是如何读取最后两行?
Yac*_*oby 11
它使用防护,如果你来自具有C风格语法的语言有点类似于switch
结构.
最后一个模式读取:如果函数p
使用参数求值为true,x
则返回列表的头部和列表的已过滤尾部.否则只返回列表的过滤尾部.
您也可以像这样重写它:
filter p (x:y) = if ( p x ) then
x:filter p y
else
filter p y
Run Code Online (Sandbox Code Playgroud)
filter
,应用于谓词和列表,返回满足谓词的那些元素的列表; 即,Run Code Online (Sandbox Code Playgroud)filter p xs = [x | x <- xs, p x]
要向不理解列表推导的人解释,你可能会说filter
有三种情况:
这些案例与您问题中定义的最后三行一一对应.
小的触摸可以使定义更惯用,因此更容易阅读:
filter _ [] = []
filter p (x:xs)
| p x = x : filter p xs
| otherwise = filter p xs
Run Code Online (Sandbox Code Playgroud)
对于空列表,谓词可以是任何内容,并且下划线明确显示在这种情况下它是不重要的.
而不是匹配(x:y)
,使用(x:xs)
-think:"ex和exes" - 强调你将列表分成头部(类型a
)和尾部(类型[a]
,即列表a
).
最后,将递归调用排成一行filter
可以让读者看到后一种情况省略x
.