haskell - 给定 bool 值列表的列表,返回 bool 值

标签 haskell

我有一个函数,定义如下,它给出一个 bool 值列表列表并返回一个 bool 值:

evaluates :: [[Bool]] -> Bool

我尝试了以下方法:

evaluates  :: [[Bool]] -> Bool
evaluates  ((y:ys):xs) = (y && (head ys)) || evaluates (tail xs)

但这不起作用。

我期望的结果是:

[True && False && True] ||  [True] || [False && False]] = True

对于以下条目:[[True, False, True], [True], [False, False]]

最佳答案

您尝试在单个函数中执行太多操作。让我们分三步解决问题:

  1. 创建一个接受 Bool 列表的函数,并返回这些 Bool 的逻辑 AND;
  2. 创建一个函数,该函数接受 Bool 列表并返回这些 Bool 的逻辑或;和
  3. 创建一个接受 [Bool] 列表的函数,首先将其与第一个函数进行映射,然后对其执行第二个函数。

我们可以使用foldr :: Foldable t => (a -> b -> b) -> b -> t a -> b来实现第一个函数。 :

_and :: [Bool] -> Bool
_and = foldr (&&) True

事实上,Haskell 前奏已经 and :: Foldable f => f Bool -> Bool功能。

第二个函数也可以使用 foldr 来实现:

_or :: [Bool] -> Bool
_or = foldr (||) False

Haskell 前奏已经 or :: Foldable f => f Bool -> Bool功能。

现在我们可以用map :: (a -> b) -> [a] -> [b]定义evaluate :

evaluate :: [[Bool]] -> Bool
evaluate = _or . map _and

我们甚至可以将上述内容概括为适用于两个(可能不同的)Foldable:

evaluate :: (Foldable f, Foldable g) => f (g Bool) -> Bool
evaluate = foldr ((||) . and) False

或类似@DanielWagner说,我们可以使用any :: Foldable f => (a -> Bool) -> f a -> Bool :

evaluate :: (Foldable f, Foldable g) => f (g Bool) -> Bool
evaluate = any and

例如:

Prelude> evaluate [[True, False, True], [True], [False, False]]
True
Prelude> evaluate [Just False, Just False, Nothing]
True
Prelude> evaluate [Just False, Just False, Just False]
False
Prelude> evaluate (Just [True, False, True])
False
Prelude> evaluate (Just [True, True, True])
True

关于haskell - 给定 bool 值列表的列表,返回 bool 值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56517712/

相关文章:

haskell - haskell 中的变量值

haskell - 定义不带数据构造函数的新数据类型

haskell - Aeson 中的单标签构造函数

list - 在 Haskell 中将已知长度的列表转换为嵌套对的最简单方法是什么?

scala - 为什么 Scala 中没有 "Functor"特征?

windows - 在haskell中删除文件

Haskell YAML 准引用?

Haskell 日期解析和格式化

haskell - Threepenny GUI - 将接收器与 Canvas 一起使用

haskell - Haskell 中一个奇怪的类型类。什么是 "class (Eq e, GenExpr e, MonadRandom m) => GenProg m e | e -> m where"