【发布时间】:2019-04-24 06:47:06
【问题描述】:
我构建了一个函数来验证可折叠结构的所有元素是否相等。
与列表中的类似功能相比,在我看来,更通用的功能异常复杂,但我无法简化它。
你有什么建议吗?
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
【问题讨论】:
-
当然,你总是可以
allElementsEqualF = allElementsEqualL . toList。 -
@AlexeyRomanov 我最近想到了这个解决方案,但我认为从类型之间转换的角度来看它可能非常昂贵。如果一切都以“懒惰”的方式发生,也许这将是最方便和最快的解决方案。对吗?
-
@AlexeyRomanov 我认为也是一个混合解决方案:allElementsEqualF2 xs -- | F.null xs = True -- |否则 = all (== x) xs -- 其中 -- x = head $ F.toList xs --- 所以如果 goList 是惰性的,则对原始类型(全部)进行测试。
-
我认为值得单独回答 :)
标签: haskell