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

时间:2017-06-01 23:01:49

标签: haskell list-comprehension

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

f x = [not a | a<-[x,not x], a]

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

2 个答案:

答案 0 :(得分:5)

此列表理解包含三个部分:

   [ not a | a <- [x, not x], a ]
--   ^ yield ^ generator      ^ filter

生成器 因此允许a 迭代在包含两个元素的列表上。这些元素为[True,False][False,True](取决于x的值)。但因此总是相同的值(只有元素的顺序不同)。

接下来, 过滤器 部分位于a。过滤器保留谓词为True 的值。这里的谓词只是a:所以它保留了a = True的配置。由于枚举True的{​​{1}}和False,这意味着我们只考虑一个项:a是{ a

对于该值,我们 产量 True。现在not a当然是not True。因此,无论False的价值如何(只要xTrue),我们都会生成False

结果是:

[False]

答案 1 :(得分:0)

您也可以通过等式推理来理解这一点。从列表理解开始:

char

Desugar到列表monad:

f x = [not a | a <- [x, not x], a]

Desugar f x = do a <- [x, not x] guard a pure (not a) 符号:

do

为列表定义f x = [x, not x] >>= \ a -> guard a >> return (not a) 的定义:

>>=

内联f x = concatMap (\ a -> guard a >> return (not a)) [x, not x] / guard

>>

内联f x = concatMap (\ a -> if a then return (not a) else []) [x, not x]

return

f x = concatMap (\ a -> if a then [not a] else []) [x, not x] 展开到concatMap g xs

concat (map g xs)

内联f x = concat (map (\ a -> if a then [not a] else []) [x, not x])

map

请注意,如果f x = concat [ if x then [not x] else [] , if not x then [not (not x)] else [] ] if x then [not x] else [],则[False]评估为xTrue[]x评估为False如果if not x then [not (not x)] else [][],则x评估为True;如果[False]x,则False评估为f x = if x then [False] ++ [] else [] ++ [False] 。因此你有:

[False] ++ [] == [] ++ [False] == [False]

f x = [False] 开始,你得到:

JSON.stringify