Haskell 将谓词与逻辑&&;内滤波函数

Haskell 将谓词与逻辑&&;内滤波函数,haskell,Haskell,我只是偶然发现了这句话: 在列表理解中应用多个谓词的过滤器等效于多次过滤某些内容,或者将谓词与逻辑&&函数连接起来 有人能给最后一部分举个例子吗(将谓词与逻辑&&函数连接起来) 作者的意思是这样的吗(这是行不通的): filter(>3)和&(filter的谓词参数是一个函数,因此需要使用lambda: filter (\x -> x > 3 && x < 10) [5,3] 但是我个人并不觉得这特别好。或者,不使用lambda抽象(匿名函数),可以使用let

我只是偶然发现了这句话:

在列表理解中应用多个谓词的过滤器等效于多次过滤某些内容,或者将谓词与逻辑&&函数连接起来

有人能给最后一部分举个例子吗(将谓词与逻辑&&函数连接起来)

作者的意思是这样的吗(这是行不通的):


filter(>3)和&(
filter
的谓词参数是一个函数,因此需要使用lambda:

filter (\x -> x > 3 && x < 10) [5,3]

但是我个人并不觉得这特别好。

或者,不使用lambda抽象(匿名函数),可以使用
let
where
定义想要的过滤器谓词,并给它一个名称

let inRange x = x > 3 && x < 10
in  filter inRange [5,3]
设置范围x=x>3&&x<10
范围[5,3]内的过滤器

当谓词较短时,使用lambda会更方便,如本例中所示。另一方面,给谓词一个名称有助于提高代码的可读性,澄清意图。

我看到的一个有趣的技巧是,如果您计划以这种方式组合多个谓词,则定义
()=liftA2(&&&&)
。然后您可以编写
过滤器((> 3)  (< 10))
,可读性很好。在PureScript标准库中,这是开箱即用的,感谢您的回答。在我看来,作者不应该假设读者在书中的这一点上做适当的扩展,因为
lambda
s和
应用程序
都没有介绍。@ChrisGraf您没有如果您在[5,3]
中的过滤器中使用
let inRange x=x>3&&x<10,则需要一个lambda。这使用了书中所用的样式,仅在您引用的部分上方几行。@chi好的一点,您可以添加此作为附加答案吗?我认为这对其他在这个问题上遇到障碍的人也会有所帮助。
let inRange x = x > 3 && x < 10
in  filter inRange [5,3]