map も flatMap も yield も使わずに、ScalaのforをMonadのための構文として利用する方法

注意: 遊んでみただけなので実用的ではない*1だろうし、この仕組みをあえて使ってる例全く見たこと無いし、初心者は混乱するかもしれないのであまり真面目に見ないほうがいいかもしれません


forでyield使わなくても、foreachが値を返す場合、for全体も値を返すのですね・・・

https://gist.github.com/xuwei-k/5611368

「pointとbindさえ実装すればMonadだよ!」*2というのがわかりやすいように、わざとtrait作りましたが、べつにforeachを直接MaybeやConsListに実装しても同じです

*1:ここから色々工夫しないと、pointの型書かないといけないとか、そもそもこうやってforeachを定義してもなにもメリットない?とか

*2:そして、foreachは通常ではUnit返すのに、そうではなく foreach == bind == "通常のflatMapのシグネチャ" にしてあるのがポイント