这个列表理解如何产生这个输出?

2 haskell list-comprehension

我正在处理一些Haskell函数示例,但我不明白这个特定的函数:

f x = [not a | a<-[x,not x], a]
Run Code Online (Sandbox Code Playgroud)

它产生[False]输出,但我不明白为什么.请详细解释一下吗?

Wil*_*sem 5

该列表理解包括三个部分:

   [ not a | a <- [x, not x], a ]
--   ^ yield ^ generator      ^ filter
Run Code Online (Sandbox Code Playgroud)

发电机从而让a 迭代在一个列表有两个元素.这些元素是[True,False][False,True](取决于价值x).但因此总是相同的值(只有元素的顺序不同).

接下来是滤波器部分a.过滤器保留谓词所在的值True.这里的谓词很简单a:所以它保留了配置a = True.由于这两个TrueFalsea列举,这意味着我们只需要一个项目考虑:一个地方aTrue.

对于那个价值,我们屈服 not a.现在not True是当然的False.因此,无论价值如何x(只要是TrueFalse),我们将始终生成[False].

结果如下:

Prelude> let f x = [not a | a<-[x,not x], a]
Prelude> f True
[False]
Prelude> f False
[False]
Run Code Online (Sandbox Code Playgroud)

  • @Snxby你问为什么列表推导过滤器只保留谓词给出"真"的值.这里有两个可能的答案,取决于您打算提出的问题.如果你打算问"你怎么知道这是行为",答案是[查看报告](https://www.haskell.org/onlinereport/haskell2010/haskellch3.html#x8-420003.11) .如果您打算询问"为什么选择了这种行为",答案是因为只保留列表中的某些元素是一种常见需求,这是满足这种需求的一种自然而简单的方法. (2认同)