当前位置:  开发笔记 > 前端 > 正文

使用foldl计算真值的数量

如何解决《使用foldl计算真值的数量》经验,为你挑选了1个好方法。

我正在尝试使用foldl找到一种方法来执行以下功能:

count a = length (filter (\i -> i) a)

它只计算布尔值列表中的值的数量.我亲自尝试过

count = foldl (\i -> 
            case i of
                True -> (1+)
                False -> (0+)
            ) 0

哪个甚至没有编译.有什么建议?



1> Logan Capald..:

那么让我们看看所涉及的功能类型

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

所以对于你的Bools 列表,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


数据Bool = False | 真的是按顺序完成的原因;)这不是任意的.它也在报告http://www.haskell.org/onlinereport/basic.html中定义,所以如果你以另一种方式做,那就不再是Haskell了.
推荐阅读
ifx0448363
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有