Haskellに欲しいScalaの機能
Scalaのワイルドカードで無名関数を書ける機能が欲しい!!
例えば自然数が1から順番に入ってるリスト(配列)を2倍して1足して奇数のリストを作りたいとする。普通に書くとこんな感じ。
odds0 = map (\n -> 2*n + 1) [0..]
一時変数導入したら負けだと思うのでポイントフリースタイルで書くとこうなる。
odds0' = map ((+1) . (2*)) [0..]
わかりにくいけどまあ許容範囲。では,1を足すのではなく引いてみた場合はどうなるか。
odds1' = map ((flip (-) 1) . (2*)) [1..]
普通に(-1)と書くとマイナスが単項演算子扱いされて数値リテラルになってしまうため,こう書かざるを得ない。これはめんどくさいし読みにくい。
Scalaのワイルドカードを導入すると,これが
odds = map (2*_ + 1) [0..] odds = map (2*_ - 1) [1..]
こう書ける。分かりやすい!読みやすい!
現状のHaskellの仕様だと, "_" はパターンマッチのところにしか現れない(多分)。なので,Scalaのようにワイルドカードを使って無名関数を書けるようにしても問題は無い…かな?
とにかくHaskellにもワイルドカード使った関数定義が欲しい!!JavaScriptにも欲しい!!てな日記でした。
けど多くの場合はリスト内包表記使えばいいんじゃないかなとも思った。mapだけじゃなくてfilterもできるし。
odds = [ 2*n + 1 | n <- [0..] ]
そして奇数を列挙するだけならmapすら使う必要は無かったことに気づいた…。だめじゃん
odds = [1, 3 .. n]