10.8 練習問題
- 以下のインスタンス宣言を完成させよ。
instance Monad Maybe where ... instance Monad [] where ...
ここで[]
は、[a]
から型変数を取り除いたリスト型を表す。
ヒント:最初に、それぞれのインスタンスのメソッドreturn
と>>=
の型を考えよ。
Maybe
はもう自習してたから、[]
だけ考えればいいんだけど、こんなんでいいのかな?
LINQに馴染んでいるので、リストがモナドだってことと、bindはSelectMany(scalaならflatMap)ってことは知ってる。
-- return :: a -> Maybe a -- >>= :: Maybe a -> (a -> Maybe b) -> Maybe b instance Monad Maybe where return x = Just x Nothing >>= _ = Nothing Just x >>= f = f x
-- return :: a -> [a] -- >>= :: [a] -> (a -> [b]) -> [b] instance Monad [] where return x = [x] xs >>= f = concat (map f xs)
ぐぐったらHaskellにconcatMapという関数があるみたいなのでそれでもよいと思うのだが、教科書には載ってなかったからあえて使わず。