'a' to 'c' (RichChar#to)

先日の記事
2008-05-25 - ryugateの日記
中の

scala> for (i <- 1 to 2 ; c <- 'a' to 'c') yield (i,c)

は、失敗するのだけれど。

scala> for (i <- 1 to 2 ; c <- ('a' to 'c').toList) yield (i,c)

なら、うまくいく。

ことについて、
またしてもlingrでmizushimaさんに講義していただきました。

まとめると、

forは「yieldがある場合は、flatMap,mapなどの組み合わせに
無い場合は、foreach,filterなどの組み合わせに展開される」が、
その中で、
「'a' to 'c'がIterable[Char]ではなく、Iterator[Char]を返すこと」
の影響によって
「Iterable[Char]が要求されているのに、実際の型はIterator[(Int, Char)]型だよ、
という型エラーになってしまう」

です。

ではなぜ、「'a' to 'c'」つまり、RichChar#toが
「IterableじゃなくてIteratorを返すようにしたのか」

については、現時点では不明なのですが、
その後、misuzhimaさんがscala-userにポストした質問の反応を見ると、
どうも、バグ臭いということのようです。

いずれにせよ、forは、単純にループとして使う場合と、
内包表記として使う場合(つまり、yieldがある場合)とは、
展開形が異なるので注意が必要のようです。