gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 20:25:49 26 4
gpt4 key购买 nike

我有一个函数,定义如下,它给出一个 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com