2

このコンビネータに巧妙な名前や深い意味はありますか?

apm :: Monad m => m (a -> m b) -> m a -> m b
apm f g = f >>= (=<< g)

これは のモナド形式によく似ており(<*>)、効果のあるラムダ計算を扱うときに頻繁に出てきます。

4

3 に答える 3

4

これは、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最小限の関数セットで非常に喜んで置き換えることができます。

于 2013-08-17T20:23:01.013 に答える
1

これはクライスリの矢を入れたらもっと自然に出てきそうな気がする…

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ですが、これが「より深い意味」を示しているかどうかはわかりません。

于 2013-08-17T08:43:30.080 に答える