2012-02-28 12 views
4

リストとメイプを同時にマップしてフラット化できるコードを探しています。私はthis topicに、このようなflatMap機能が見つかりました:フラットマップリストとメイプル

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

+2

Or = <<、リストバージョンの場合 –

答えて

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

これは、 'foldMap'と呼ばれる' Data.Foldable'の中にすでに関数があります。 – dflemstr

+0

@dflemstr:これをMaybeと動作させるにはどうすればいいですか? 'foldMap id [Just 1]'はエラーを生成します。 – sschaef

+0

'foldMap'が' flatMap'と同じであると言ったときにちょっと嘘をつきました。 'foldMap'はリストだけでなく、*追加可能な型を返すことができます。これは、外部関数が返す追加可能な型を決定する、マップする関数の戻り値の型です。 'id'関数は' Maybe'を返すので、 'foldMap'はそれを返そうとします。しかし、 'たぶん'はScalaのように一つのアイテムのコレクションではありません。 'mappend(Just [4])(Just [5])'を実行すると、 'Just [4,5]'になります。それをリストと比較すると、 'mappend [[4]] [[5]]'は[[4]、[5]]になります。 (続ける...) – dflemstr

関連する問題