return
に関しては、一般的に実装できませんfmap
。 Monad
よりも強力ですFunctor
。
ただし、演習として、次の質問をしてみることができます: 2 番目の操作があれば、次return
の順番で実装できるようになりfmap
ますか? 型を見ることで、この問題に取り組むことができます。(代わりに from クラスをpure
使用します—それらは基本的に同じ操作です。)Applicative
return
fmap :: Functor f => (a -> b) -> f a -> f b
pure :: Applicative f => a -> f a
さて、これが進む可能性のある方法の1つは、次の関数がある場合です。
-- This is like the standard `const` function, but restricted to the `()` type:
const' :: a -> () -> a
const' a = \() -> a
次に、これを書くことができます。これは「ほぼ」pure
/return
です。
almostThere :: Functor f => a -> f () -> f a
almostThere a = fmap (const' a)
そして、次のクラスがあれば、pure
それに関して書くことができます:
class Functor f => Pointed f where
unit :: f ()
pure :: Pointed f => a -> f a
pure a = almostThere a unit
長い話を短くすると、これはつまりreturn
、pure
をゼロからunit
作成できる関数であり、既に別のを持っている場合にのみを作成できる関数です。/ をゼロから作成する「力」を持つ 3 番目の操作にアクセスできない限り、/を実装するために使用できる方法はありません。私が示した操作は、おそらくこの「力」を持つ最も単純な操作です。f
fmap
f
fmap
return
pure
f
unit