このコンビネータに巧妙な名前や深い意味はありますか?
apm :: Monad m => m (a -> m b) -> m a -> m b
apm f g = f >>= (=<< g)
これは のモナド形式によく似ており(<*>)
、効果のあるラムダ計算を扱うときに頻繁に出てきます。
このコンビネータに巧妙な名前や深い意味はありますか?
apm :: Monad m => m (a -> m b) -> m a -> m b
apm f g = f >>= (=<< g)
これは のモナド形式によく似ており(<*>)
、効果のあるラムダ計算を扱うときに頻繁に出てきます。
これは、Arrow のモナドに相当するものです。
app :: ArrowApply (~>) => (b ~> c, b) ~> c
最近答えていた.
app
モナドの場合、その型は次のように音訳されます。
app' :: Monad m => m (a -> m b, a) -> m b
しかし、関数を使用してより大きな柔軟性を導入することも、モナド プログラミングの一部です (実際、その柔軟性の省略が必要なArrow
理由app
です)。したがって、型のより良いが、あまり文字通りではない翻訳は次のようになります。
appm :: Monad m => m (a -> m b) -> m a -> m b
あなたが与えたタイプです。結論: これは の単項等価でありapp
、単項項を作成して使用することができます。>>=
モナドを定義するために、またはjoin
最小限の関数セットで非常に喜んで置き換えることができます。
これはクライスリの矢を入れたらもっと自然に出てきそうな気がする…
a -> m b ≅ Kleisli m a b
m a -> m b ≅ Kleisli m (m a) b
基本的には
apm' :: Monad m => m (Kleisli m a b)
-> Kleisli m (m a) b
...これは非常に素晴らしいIMOですが、これが「より深い意味」を示しているかどうかはわかりません。