Итак, давайте проверим типы задействованных функций
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