[1,1,2,2,3,3…] のような無限リストを作る
すごいH本読みながら関数型プログラム勉強を始めました。
- 作者: Miran Lipovača,田中英行,村主崇行
- 出版社/メーカー: オーム社
- 発売日: 2012/05/23
- メディア: 単行本(ソフトカバー)
- 購入: 11人 クリック: 464回
- この商品を含むブログ (24件) を見る
内容が面白いので、まだ最初の方ですが本読みつつ手元のMacで動作確認してたら、
ふと「 [1,1,2,2,3,3…] のような無限リストを作るのってどうするんだろう?」と思ったので
ツイッターでつぶやいてみました。
Haskellで [1,1,2,2,3,3]って無限に続くリストを作りたい時ってどうするんだろ?
@tan_go238 foldr1(++)$map (\(x,y)->[x,y])(zip[1..][1..]) こうですかわかりません
2012-07-06 22:50:39 via web to @tan_go238
まだすごいH本の3章までしか読んでないので、foldr1とかよく分かんない関数ばっかりだけど、
実行してみたらなんか知らんがうごいた!すごい。
ふむ。これも動いた。0から始まってたけどこれはfrom(1)にすれば問題ない。
キモいけど Iterator.from(2).map(_ / 2) でもいけそう?キモいけど
おお、なんじゃこれ。よくわからない。。。
って言ったら教えてくれました。
@tan_go238 Iterator.from(2)で2, 3, 4, 5 となる無限リストが得られます。map(_ / 2) は map { x => x / 2 } です。2 / 2 は 1、3 / 2 は 1、4 / 2 は 2、5 / 2 は 2 という感じです
2012-07-07 00:43:37 via YoruFukurou to @tan_go238
なるほどー。桁落ちしてるのね。
一応考えたからうpdef dbl(i:Int):Stream[Int] = i #:: i #:: dbl(i+1)dbl(1).take(10).toList
2012-07-07 00:55:46 via web
Scalaで書いてもらったことで、プログラムの書き方的に Haskell との共通点とか違うところとか Scala の独自なところがおぼろげながら見えて面白かった。
「せっかくだしまとめようかなー」って思ってたら、以下のようなツイートを発見。
.@backpaper0 Iterator.from(0).flatMap{x => x :: x :: Nil}
2012-07-07 00:30:56 via web to @backpaper0
これはわかりやすいなー。
Haskellだとどうなるんだろと思ったので調べて書いてみた。
concatMap (\x -> [x]++[x]) [1..]
関数型面白いねー。もうちょっとすごいH本読み進めてみよう。