あなたは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
をご存知の場合は、sequenceA
とtraverse
はそれらの一般化です。
'justOne'関数をかなり一般化することができます:' foldr(\ a _ - > pure a)empty ::(代替f、Foldable t)=> ta→fa'は直感的に一番右の要素であるか、コンテナが空の場合には失敗します。左端の – user2407038
@ user2407038 – user3237465
@ user2407038はい、Foldableの一般化は問題ありませんが、「純粋な」一般化が非常に有用であるかどうかはわかりません。例えば、 'ZipList'や'( - >) 'のように、何か役に立つものや期待できるものはありますか?関連:https://wiki.haskell.org/Why_not_Pointed%3F – jpath