haskell - 测试 Foldable 的所有元素是否相同
问题描述
我构建了一个函数来验证可折叠结构的所有元素是否相等。
与列表中的类似功能相比,在我看来,更通用的功能异常复杂,但我无法简化它。
你有什么建议吗?
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
推荐阅读
- javascript - 显示失败测试中预期和接收的全部输出
- discord - 在频道 Discord.js 中查找最后一个附件
- debian - 当 Tor 连接在 Tails 上处于活动状态时,显示会出现故障
- spring-boot - 春季启动仇恨的Kotlin递归问题
- javascript - 为什么我的页面在发表评论后没有重新加载视图?
- python - json.decoder.JSONDecodeError:预期值:python3 中的第 1 行第 1 列(字符 0)
- mongodb - 如何在猫鼬模式中存储范围(以地理圆半径形式)
- python - Django - 处理 KeyError 事件 (API)
- python - 由于 /tmp 中的临时 .partd 文件,合并 dask 数据帧会导致磁盘错误
- oracle - 如何编写两个表的正确左连接?