gpt4 book ai didi

haskell - 测试 Foldable 的所有元素是否相同

转载 作者:行者123 更新时间:2023-12-04 01:26:38 26 4
gpt4 key购买 nike

我构建了一个函数来验证可折叠结构的所有元素是否相等。

与列表中的类似功能相比,在我看来,更通用的功能异常复杂,但我无法简化它。

你有什么建议吗?

import Data.Monoid
import Data.Sequence as SQ
import Data.Matrix as MT

allElementsEqualL :: Eq a => [a] -> Bool
allElementsEqualL [] = True
allElementsEqualL (x:ns) = all (== x) ns
-- allElementsEqualL [1,1,1] -> True

allElementsEqualF :: (Foldable t, Eq a) => t a -> Bool
allElementsEqualF xs = case (getFirst . foldMap (First . Just) $ xs) of
Nothing -> True
Just x -> all (== x) xs

-- allElementsEqualF [1,1,1] -> True

-- allElementsEqualF $ SQ.fromList [1,1,1] -> True

-- allElementsEqualF $ MT.fromLists [[1,1],[1,1]] -> True

最佳答案

我不知道不太复杂,但我认为这是“最干净”的方式。 “干净”是指使用单个特殊的 Monoid 对结构进行一次遍历。 .

data Same a = Vacuous | Fail | Same a
instance Eq a => Semigroup (Same a) where
Vacuous <> x = x
Fail <> _ = Fail
s@(Same l) <> Same r = if l == r then s else Fail
x <> Vacuous = x
_ <> Fail = Fail
instance Eq a => Monoid (Same a) where
mempty = Vacuous

allEq :: (Foldable f, Eq a) => f a -> Bool
allEq xs = case foldMap Same xs of
Fail -> False
_ -> True

关于haskell - 测试 Foldable 的所有元素是否相同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55815807/

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