LoginSignup
3
3

More than 5 years have passed since last update.

Perl6の無限リストで遊ぶ

Posted at

こんにちは!
Perl6初心者です!

Perl6のドキュメントは http://design.perl6.org/ で読むことができるようです。
今回は無限リストで遊んでみましょう。

Perl6では無限リストを作ることができます。
たとえば、1 から Inf までの無限リストは以下のようにして作ることが出来ます。

Rangeを使った無限リスト

(1...Inf)

Inf* と表現することもできるのでもっと簡潔に書くこともできます。

(1...*)

関数を使った無限リスト

無限リストということで、Sub...Inf のように書くことで関数も扱うことが出来ます。
たとえばランダムで True または False が返る無限リストを作ることができます。

(-> { (True, False).pick } ... *)

さらに、初期値を与えることで、前回の値をもとに次の値を生成するといったこともできます。
等差数列を簡単につくることができますね。

(1, -> $n { $n + 3 } ... *)

なお、値を取る場合は、引数を * で表すことでラムダ式を以下のように簡易的に書くこともできます。

(1, * + 3 ... *)

2つ以上の値を初期値として取ることもできます。

(0, 1, * + * * 2 ... *)

これを発展させると、mattnさんの Perl6 の無限リストとダイナミックバインディングが最強すぎる で書かれているようなフィボナッチ数列を表す無限リストを書くことができます。
詳しくは tokuhiromさんが解説している のでそっちを読むと良いです。

当たり前に無限リストに対するmap/grepなどもできます。

(1...*) ==> map { $_ + 2 }

あそぶぞー

FizzBuzzでもやってみましょうかね!
mapで書いてみる。

(1...*) ==> map { $_ % 15 == 0 ?? "FizzBuzz" !!  $_ % 5 == 0 ?? "Buzz" !! $_ % 3 == 0 ?? "Fizz" !! $_ }

関数でも書いてみる。
クロージャにすることでうまくいった。もっとすっきり書けそう。

my $n = 0;
(-> { $n++; $n % 15 == 0 ?? "FizzBuzz" !! $n % 5 == 0 ?? "Buzz" !! $n % 3 == 0 ?? "Fizz" !! $n } ... *)

無限リストをO/R Mapperで採用する可能性

無限リストでデータベースを扱うことも可能かもしれませんね!(愚直にやるとクソクエリ吐きそうだけど)

my ($user1, $user2, $user3) = DB.users()[1..3]

まとめ

無限リストたのしい!

明日は @B73W56H84 さんによる "Perl6 Cookbook的な内容!" です。おたのしみに!

3
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
3