Learn You A Haskellのテキストでは、リストモナドは次のように定義されています。
instance Monad [] where
return x = [x]
xs >>= f = concat (map f xs)
fail _ = []
bind オペレーターはリスト値をそのままの値に変換しconcat
、リスト性のレイヤーをトリミングすることになっているため、この定義は一見すると理にかなっています。[a]
しかし、map の output-typeが concat の input-type と一致しない場合、この定義はどのようにコンパイルできます[[a]]
か?