基础库有一些重大变化,所以我想知道今天的惯用解决方案是否会涉及fmap
,Maybe
,Monoid
,First
, Foldable
以及其他类别。
我认为我需要fold
Monoid
与zip [1..]
,First
,a -> Bool
和Maybe
的复杂结构,但是无法找到明显的方法将这些东西组合在一起。
另外,我怀疑大部分代码都在库中。我不确定是否需要(或多少)newtype
包装器来组合类来获得我需要的结构。
答案 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
幺半群。)