繁体   English   中英

了解Haskell的过滤器

[英]Understanding Haskell's filter

我知道Haskell的过滤器是一个高阶函数(意思是一个函数,它接受另一个函数作为参数),它通过一个列表检查哪个元素满足某个布尔条件。

我不太明白它的定义:

filter:: (a->Bool)->[a]->[a]
filter p [] = []
filter p (x:y) | p x = x:filter p y
               | otherwise = filter p y

我知道如果我将一个空列表传递给该函数,它只会返回一个空列表,但是如何读取最后两行?

它使用保护 ,如果你来自具有C风格语法的语言有点类似于switch结构。

最后一个模式读取:如果函数p使用参数x求值为true,则返回列表的头部和列表的已过滤尾部。 否则只返回列表的过滤尾部。

您也可以像这样重写它:

filter p (x:y) = if (  p x ) then
                     x:filter p y
                 else
                     filter p y

考虑文档中filter描述

filter ,应用于谓词和列表,返回满足谓词的那些元素的列表;

 filter p xs = [x | x <- xs, px] 

要向不理解列表推导的人解释它,您可能会说过filter有三种情况:

  1. (简单的情况)当要过滤的列表为空时,结果也为空
  2. 当要过滤的列表的头部满足谓词时,它是结果的一部分
  3. 否则,跳过头部并过滤列表的其余部分

这些案例与您问题中定义的最后三行一一对应。

小的触摸可以使定义更惯用,因此更容易阅读:

filter _ []      = []
filter p (x:xs)
  | p x          = x : filter p xs
  | otherwise    =     filter p xs

对于一个空列表,谓词可以是任何东西,下划线明确表明它在这种情况下不重要。

而不是匹配(x:y) ,使用(x:xs) -think:“ex和exes” - 强调你将列表分成头部(类型a )和尾部(类型[a]a )的列表。

最后,将递归调用排列成filter可以让读者看到后一种情况省略了x

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM