関数fmapの定義を与える::(a-> b)-> IO a-> IO b
その効果は、関数をその結果に適用することによって相互作用を変換することです。do構文を使用して定義する必要があります。
fmapをどのように定義する必要がありますか?わからない?
誰かがそれを手伝ってくれる?
ありがとう〜!
宿題か何かのように見えるので、残りの詳細を自分で作業できるように、十分なヒントを提供します。
fmap1 :: (a -> b) -> IO a -> IO b
fmap1 f action =
action
はIO
アクションとしてであり、からへf
の関数であり、したがってタイプです。a
b
a -> b
タイプを持つモナドバインドに精通している場合>>=
(モナド用に簡略化IO
)
(>>=) :: IO a -> (a -> IO b) -> IO b
今あなたが見れば
action >>= f
これは、出力(たとえばタイプ)IO
を返すアクションを実行し、タイプであるためタイプである出力を渡すことを意味します。out
a
f
a -> IO b
f out
IO b
return
タイプを持っていると呼ばれる2番目の関数を見ると(ここでもIO
モナドのために単純化されています)
return :: a -> IO a
タイプの純粋な値を取り、タイプのアクションをa
提供します。IO
IO a
では、を振り返ってみましょうfmap
。
fmap1 f action
これは、IO
アクションを実行f
してから、アクションの出力で実行され、出力をIO
タイプの別のアクションに変換しますIO b
。したがって
fmap1 f action = action >>= g
where
g out = return (f out)
do
次に、表記法の糖衣構文が登場します。>>=
これは、別の方法でバインドを書き込むことです。
do
表記法では、次の方法でアクションの出力を取得できます。
out <- action
したがって、バインドは次のようになります
action >>= f = do
out <- action
f out
これで、fmapの定義をconstructに変換できるようになると思います。
あなたは地図に精通していますか?
マップの種類は
マップ::(a-> b)-> [a]-> [b]
実行した場合
マップ(* 5)[1,2,3]
あなたが得る
[5,10,15]
マップのポイントは、変換関数とソースリストを提供し、リストに変換を適用して結果リストを取得することです。
mapはリストのfmapです。彼らはあなたにIOタイプのfmapを書いて欲しいのですが、これは役に立ちますか?
fmapについて詳しく知りたい場合は、http://learnyouahaskell.com/making-our-own-types-and-typeclasses#the-functor-typeclassをお読みください。
すべてのモナドはすでにファンクターであることに注意してください。ただし、再実装する場合fmap
は、モナディック関数の観点から簡単に再実装できます。1つのモナド法はこれです:
fmap f xs = xs >>= return . f
表記法を十分に理解していれば、それを自分で翻訳できるはずです。そうでない場合は、質問してください。