Data.Map.unionWithと似た関数を書こうとしましたが、失敗する可能性があります。元のものはMaybeを使用しています。これは確かにMonadです。したがって、モナドなものは私のためにうまくいきます。私はunionWithの型の要件を満たすために純粋にそれをfmappedしたので、Applicativeで書き直すことができるのだろうかと思います。または、unionWithの代わりにData.Mapの他の関数を使用しますか?このunionWithのような関数をMonadの代わりにApplicativeで書き直すことはできますか?
{-# LANGUAGE RankNTypes #-}
import Control.Monad
import Data.Map
unionWithM :: (Monad m, Traversable t)
=> (forall a. (a -> a -> a)
-> t a
-> t a
-> t a
)
-> (v -> v -> m v)
-> t v
-> t v
-> m (t v)
unionWithM u f a b = sequenceA (u f' (pure <$> a) (pure <$> b))
where f' x y = join $ f <$> x <*> y
unionWithOriginal :: Ord k => (a -> a -> Maybe a) -> Map k a -> Map k a -> Maybe (Map k a)
unionWithOriginal f a b = sequenceA (unionWith f' (Just <$> a) (Just <$> b))
where f' x y = join $ f <$> x <*> y
AFAICSにそれを簡略化することができ
these
パッケージを使用する場合は手動でを取得し、 'unionWithM'は不可能です:' unionWith'は 'v'結果を養うことができます'v - > v - > mv'の' v - > v - > mv'の別の呼び出しに '' v - > v - > mv'これは、モナドを必要とするKelisli構成に近いです。 – chi