> do n<-[1..10]; hogehoge
> っていうのも、C言語では、以下のような for 文を表しているようなものか。
ちょと違います.doはモナド演算の構文糖衣なので,
do n<-xs;f x = xs >>= f
ここまではリストは関係無いですが,さらに,List Monadの>>=はconcatMapなので,
xs >>= f = concatMap f xs
つまりxsの各要素に対し,何らかのリストを生成する関数fを適用し,生成されたリストを全部結合します.
[f x y|x<-xs,y<-ys]
というリスト内包表記も,実際は
[f x y|x<-xs,y<-ys] = do x<-xs;y<-ys;return$f x y = xs>>=(ys>>=).(return.).f
のようなとこです.
List Monadの表現するものは「可能な結果を全て順番に生成する計算」なので,ここでの関数fの持つべき意味は,「ある可能な結果を元に生成可能な次段階の結果を全て列挙する関数」となります.