我正在尝试使用foldl找到一种方法来执行以下功能:
count a = length (filter (\i -> i) a)
它只计算布尔值列表中的值的数量.我亲自尝试过
count = foldl (\i -> case i of True -> (1+) False -> (0+) ) 0
哪个甚至没有编译.有什么建议?
那么让我们看看所涉及的功能类型
Prelude> :t (\i -> case i of { True -> (1+) ; False -> (0+) }) (\i -> case i of { True -> (1+) ; False -> (0+) }) :: (Num t) => Bool -> t -> t Prelude> :t foldl foldl :: (a -> b -> a) -> a -> [b] -> a
所以对于你的Bool
s 列表,b是Bool,但你使用的函数是Bool
第一个参数,而不是第二个参数.累积值是第一个参数.相反,你可以这样做
foldl (\acc p -> case p of { True -> acc + 1 ; False -> acc }) 0
或者,如果您只想修改参数顺序,请使用原始函数 flip
Prelude> :t flip flip :: (a -> b -> c) -> b -> a -> c foldl (flip (\i -> case i of True -> (1+) False -> (0+) )) 0
或者你可以更简洁: foldl (flip ((+) . fromEnum)) 0