0

基础库发生了一些重大变化,所以我想知道今天的惯用解决方案是否会涉及fmap, Maybe, Monoid, First,Foldable以及其他类。

我想我需要fold一个Monoid带有zip [1..]、、和的复杂结构First,但找不到将这些东西组合在一起的明显方法。a -> BoolMaybe

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

4

1 回答 1

0

泽塔的评论是正确的。您可以调用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幺半群)。

于 2016-03-05T04:15:57.167 回答