Haskell中的函数有问题

Haskell中的函数有问题,haskell,Haskell,我编写了一个函数来检查一个列表是否匹配一个条件,如果匹配,它将打印该值两次。然而,在ghc中它给了我一个错误,我不明白为什么 verifyList f xs = foldl(\x acc -> if f x then x:x:acc else acc) [] xs 有什么帮助吗 看起来你指的是foldr而不是foldl。如果我做出了改变,那么它对我来说是有效的 你也可以在没有褶皱的情况下完成 verifyList f xs = concatMap (\x -> [x, x]) $

我编写了一个函数来检查一个列表是否匹配一个条件,如果匹配,它将打印该值两次。然而,在ghc中它给了我一个错误,我不明白为什么

verifyList f xs = foldl(\x acc -> if f x then x:x:acc else acc) [] xs
有什么帮助吗


看起来你指的是
foldr
而不是
foldl
。如果我做出了改变,那么它对我来说是有效的


你也可以在没有褶皱的情况下完成

verifyList f xs = concatMap (\x -> [x, x]) $ filter f xs
我想更清楚地说,这表明了你的意图。首先筛选列表以查找所有满足
f
,然后复制每个元素

-贝克利尔

另一个基于leftaroundabout评论的选项:

verifyList f xs = [y | x <- xs, f x, y <- [x, x]]

verifyList f xs=[y | x”然而,在ghc中,它给了我一个错误”-那会是什么错误?看起来你是指
foldr
而不是
foldl
。如果我做了更改,那么它对我有效。你也可以在没有
fold
s的情况下做这件事,因为
verifyList f xs=concatMap(\x->[x,x])$filter f xs
,我想说这更清楚地表明了您的意图。首先筛选列表以找到所有满足
f
,然后复制每个元素…或单个列表
[y|y@leftaroundabout,这是一种非常好的表达方式,但其中有一点错误。在使用它之前,您需要
x
在范围内。此外,您应该更早地移动
fx
,这样它就不会每次检查两次。
[y | x
verifyList f xs = filter f xs <**> [id, id]