我正在处理一些Haskell函数示例,但我不理解这个特定的函数:
f x = [not a | a<-[x,not x], a]
它产生[False]
作为输出,但我不明白为什么。可以请详细解释一下吗?
答案 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
的价值如何(只要x
或True
),我们都会生成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]
评估为x
,True
为[]
,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