2012-02-28 32 views
4

我正在尋找可以同時映射和展平列表和Maybes的代碼。我在this topic發現了這樣的flatMap功能:flatmap列表和Maybes

flatMap :: (t -> [a]) -> [t] -> [a] 
flatMap _ [] = [] 
flatMap f (x:xs) = f x ++ flatMap f xs 

這工作得很好:

> flatMap id [[],[1,2],[3],[],[4,5,6]] 
[1,2,3,4,5,6] 

唯一的問題是,它並不適用於Maybes作品。相反,我必須使用Data.Maybe.mapMaybe

> Data.Maybe.mapMaybe id [Just 1, Nothing, Just 2, Just 3, Nothing] 
[1,2,3] 

是否有一個內置的功能,可以同時處理列表和Maybes(也許一些其他類型的)?

+0

當你知道你有什麼,你可以使用['catMaybes :: [也許] - > [A]']( http://www.haskell.org/hoogle/?hoogle=catMaybes)或['concat :: [[a]] - > [a]'](http://www.haskell.org/hoogle/?hoogle = concat)與['map ::(a - > b) - > [a] - > [b]'](http://www.haskell.org/hoogle/?hoogle=map)。 – rampion 2012-02-28 14:59:57

+2

Or = <<,列表版本 – 2012-02-29 04:16:23

回答

11

我認爲Data.Foldable可能是你在找什麼:

> let flatMap f = concatMap (Data.Foldable.toList . f) 
> :t flatMap 
flatMap :: Data.Foldable.Foldable t => (a -> t b) -> [a] -> [b] 
> flatMap id [[],[1,2],[3],[],[4,5,6]] 
[1,2,3,4,5,6] 
> flatMap id [Just 1, Nothing, Just 2, Just 3, Nothing] 
[1,2,3] 
+8

在'Data.Foldable'中已經有一個函數叫做'foldMap'。 – dflemstr 2012-02-28 17:20:25

+0

@dflemstr:怎麼做才能讓這個和Maybe一起工作? 'foldMap id [只有1]'產生一個錯誤。 – sschaef 2012-02-29 12:01:53

+0

當我說'foldMap'和'flatMap'完全相同時,我說了一點:'foldMap'可以返回任何*可附加類型,而不僅僅是列表。它是您映射的函數的返回類型,它決定外部函數返回哪個可附加類型。 'id'函數返回'Maybe',所以'foldMap'試圖返回它。然而,'也許'不是像斯卡拉那樣的一個項目的集合。當你做'mappend(Just [4])(Just [5])'時,它變成'Just [4,5]'。如果你將它與列表進行比較,'mappend [[4]] [[5]]'變成'[[4],[5]]'。 (待續...) – dflemstr 2012-02-29 14:17:25