Typeclassopedia(他のソースの中でも)によると、Applicative
論理的には型クラス階層のMonad
とPointed
(したがってFunctor
)に属しているので、Haskellの前奏曲が今日書かれた場合、理想的には次のようなものになります。
class Functor f where
fmap :: (a -> b) -> f a -> f b
class Functor f => Pointed f where
pure :: a -> f a
class Pointed f => Applicative f where
(<*>) :: f (a -> b) -> f a -> f b
class Applicative m => Monad m where
-- either the traditional bind operation
(>>=) :: (m a) -> (a -> m b) -> m b
-- or the join operation, which together with fmap is enough
join :: m (m a) -> m a
-- or both with mutual default definitions
f >>= x = join ((fmap f) x)
join x = x >>= id
-- with return replaced by the inherited pure
-- ignoring fail for the purposes of discussion
(これらのデフォルトの定義がウィキペディアの説明から私によって再入力された場合、エラーは私自身のものですが、エラーがある場合は少なくとも原則として可能です。)
ライブラリは現在定義されているため、次のようになります。
liftA :: (Applicative f) => (a -> b) -> f a -> f b
liftM :: (Monad m) => (a -> b) -> m a -> m b
と:
(<*>) :: (Applicative f) => f (a -> b) -> f a -> f b
ap :: (Monad m) => m (a -> b) -> m a -> m b
各ペア内のこれらのタイプ間の類似性に注意してください。
私の質問は次のとおりです。liftM
(とは異なるliftA
)とap
(とは異なる)は、単に、念頭に置いて設計されていない<*>
歴史的現実の結果ですか?それとも、コンテキストのみを必要とするバージョンとは異なる、他の動作方法(場合によっては、いくつかの法的な定義)ですか?Monad
Pointed
Applicative
Monad
Applicative
それらが異なる場合、(Typeclassopediaや他の場所で説明されているが、型システムによって強制されていない、、、、および定義に必要なMonad
法則に従う)定義の単純なセットを提供できますか?Applicative
Pointed
Functor
liftA
liftM
あるいは、それらが明確でない場合、前提と同じ法則を使用してそれらの同等性を証明できますか?