'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がある場合)とは、
展開形が異なるので注意が必要のようです。