2015-12-23 75 views
0
指數

目前已在基礎庫的一些大的變化,所以我不知道今天慣用的解決方案是否會涉及fmapMaybeMonoidFirstFoldable也許其他類。通用方法尋找元素

我想我會需要一個foldMonoid一個複雜的結構zip [1..]Firsta -> BoolMaybe,但找不到明顯的方式把這些東西組合在一起。

另外,我懷疑這個代碼大部分是在庫中。我只是不確定是否需要編寫類(或多少)以獲得我需要的結構。

+0

聽起來像'findIndex p。 toList'。 – Zeta

回答

0

Zeta的評論是正確的。你可以打電話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幺半羣)的邏輯。