第10章 型とクラスの定義 #8

10.8 練習問題

  1. 以下のインスタンス宣言を完成させよ。
    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という関数があるみたいなのでそれでもよいと思うのだが、教科書には載ってなかったからあえて使わず。