基础库发生了一些重大变化,所以我想知道今天的惯用解决方案是否会涉及fmap
, Maybe
, Monoid
, First
,Foldable
以及其他类。
我想我需要fold
一个Monoid
带有zip [1..]
、、和的复杂结构First
,但找不到将这些东西组合在一起的明显方法。a -> Bool
Maybe
另外,我怀疑大部分代码都在库中。我只是不确定我是否需要(或多少个)newtype
包装器来组合类来获得我需要的结构。
泽塔的评论是正确的。您可以调用toList
然后在其中找到元素。但是假设我们不想这样做,我们怎么能使用幺半群呢?
这是一种方法
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
幺半群)。