2016-11-20 7 views
8

Map k [v]Data.Map.Strict)をMaybe (Map k v)に変換する関数を作成したいとします。それは何地図k [v] - >多分(地図k v)を行う良い方法はありますか?

はこれです:リストのいずれかが正確に一つの要素を持っていない場合は

  • 、機能はNothingを返します。
  • すべてのリストにちょうど1つの要素がある場合は、Justにラップされた予想マップを返します。

私は考えることができる唯一のことは、foldrWithKey'またはfoldlWithKey'を使って手動でこれを行うことです。より良い方法がありますか?

答えて

18

あなたはtraverse :: (Traverseable t, Applicative f) => (a -> f b) -> t a -> f (t b)Data.Traversable(ただし、プレリュード)から探しています。

justOne :: [a] -> Maybe a 
justOne [x] = Just x 
justOne _ = Nothing 

allJustOne :: Map k [v] -> Maybe (Map k v) 
allJustOne = traverse justOne 

traverse fはおそらく最高sequenceA . fmap fとして理解されています。他方、sequenceA :: (Traversable t, Applicative f) => t (f a) -> f (t a)は、Traversable構造から適用的な「効果」を引き出す方法です。たとえば、sequenceA :: [IO a] -> IO [a]IOのアクションのリストを実行するとします。あるいは、Maybeの場合、結果はTraversableのすべての要素がJustであり、いずれかの要素がNothingであれば、の結果もNothingとなります。

sequenceまたはmapMをご存知の場合は、sequenceAtraverseはそれらの一般化です。

+1

'justOne'関数をかなり一般化することができます:' foldr(\ a _ - > pure a)empty ::(代替f、Foldable t)=> ta→fa'は直感的に一番右の要素であるか、コンテナが空の場合には失敗します。左端の – user2407038

+0

@ user2407038 – user3237465

+0

@ user2407038はい、Foldableの一般化は問題ありませんが、「純粋な」一般化が非常に有用であるかどうかはわかりません。例えば、 'ZipList'や'( - >) 'のように、何か役に立つものや期待できるものはありますか?関連:https://wiki.haskell.org/Why_not_Pointed%3F – jpath

関連する問題