haskell - 指定真实的条件数

时间:2012-10-08 00:45:08

标签: list haskell boolean conditional-statements

如果我有4个布尔条件,并且我想说如果其中至少有3个为真,那么执行 _ _,这是否可以在Haskell中实现?

或者我是否必须完成每个排列? (即1.True,2.True,3.True,4.False和1.False,2.True,3.True,4.True等)

谢谢!

7 个答案:

答案 0 :(得分:5)

atleast :: Int -> [Bool] -> Bool
atleast n bools = length tn == n
  where  tn = take n . filter id $ bools

应该懒得工作,除非我错过了什么。

答案 1 :(得分:4)

每个排列?当然不是..你可以算出真实条件的数量。

答案 2 :(得分:4)

此解决方案与目前提供的其他解决方案的不同之处在于它短路(即,在找到n Bool s后停止。所以它可以在一些无限列表上运行(只有那些最终会评估为True的列表),并且不一定会强制评估列表中的每个元素(由于懒惰)。

atLeast :: Int -> [Bool] -> Bool
atLeast 0 _          = True
atLeast _ []         = False
atLeast n (True:bs)  = atLeast (n - 1) bs
atLeast n (False:bs) = atLeast n bs

答案 3 :(得分:4)

如果您希望它在找到N个数字时停止检查列表,您可以使用惰性自然数进行计数。

import Data.List
import Data.Number.Natural

atLeast :: Int -> [Bool] -> Bool
atLeast n = (>= (fromIntegral n :: Natural)) . genericLength . filter id

答案 4 :(得分:2)

atLeast3 :: Bool -> Bool -> Bool -> Bool -> Bool
atLeast3 b1 b2 b3 b4 = sum (map fromEnum [b1, b2, b3, b4]) >= 3

答案 5 :(得分:2)

这不是最美丽的方式,但你可能会发现

atLeast :: Int -> [Bool] -> Bool
atLeast n bools = length (filter (==True) bools) >= n

最容易理解。 filter仅保留列表中符合您提供的规则的内容。在这种情况下,规则是答案必须是True。接下来,length计算剩余的数量。

(规则是函数a -> Bool,其中a是列表中元素的类型。)

答案 6 :(得分:1)

requireAtLeast :: Int -> [Bool] -> Bool
requireAtLeast n = (>= n) . length . filter id

如果你喜欢极端有点或无意义的形式,分别是:

requireAtLeast threshold predicates = length (filter (\predicate -> predicate) predicates) >= threshold

requireAtLeast = (. length . filter id) . (<=)