我有一个函数,定义如下,它给出一个 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]]
最佳答案
您尝试在单个函数中执行太多操作。让我们分三步解决问题:
- 创建一个接受
Bool
列表的函数,并返回这些Bool
的逻辑 AND; - 创建一个函数,该函数接受
Bool
列表并返回这些Bool
的逻辑或;和 - 创建一个接受
[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/