寻找元素索引的通用方法

时间:2015-12-23 11:59:08

标签: haskell predicate fold monoids

基础库有一些重大变化,所以我想知道今天的惯用解决方案是否会涉及fmapMaybeMonoidFirstFoldable以及其他类别。

我认为我需要fold Monoidzip [1..]Firsta -> BoolMaybe的复杂结构,但是无法找到明显的方法将这些东西组合在一起。

另外,我怀疑大部分代码都在库中。我不确定是否需要(或多少)newtype包装器来组合类来获得我需要的结构。

1 个答案:

答案 0 :(得分:0)

泽塔的评论是正确的。您只需调用toList,然后找到该元素即可。但是假设我们不想这样做,我们怎么能用monoids做呢?

这是一种方法

data FirstTrue = FT Int Bool deriving Show

instance Monoid FirstTrue where
   mempty = FT 0 False
   FT n b `mappend` ~(FT n1 b1)
      | b = FT n True
      | b1 = FT (n + n1) True
      | otherwise = FT (n + n1) False

findIndex p t = let (FT i b) = foldMap (\x -> FT 1 (p x)) t
                in if b then Just i else Nothing

我不认为你可以在这种普遍性中做到这一点,只是在Foldable和现有的Monoid个实例中构建它,因为我们没有做过的作品类型让你"越过"来自两个联合的幺半群类型的逻辑(这里是Count幺半群和Any幺半群。)