私はPerl6でレイジーリストを作成するさまざまな方法を見てきましたが、フィボナッチ数列を記述する簡潔な方法をすべて集めたいと思います。
私はこれをmasakのジャーナルからの3つから始めます:
my @fibs := (0, 1, -> $a, $b { $a + $b } ... *);
my @fibs := (0, 1, { $^a + $^b } ... *);
my @fibs := (0, 1, *+* ... *);
私はこのようなものでもうまくいくと思っていましたが、構文が間違っていると思います:
my @fibs := (0, 1, (@fibs Z+ @fibs[1..*]));
何か熱心なもの(スライス?)があり、Rakudoは無限ループに入ります。これはHaskellの定義の翻訳です:
fibs = 0 : 1 : zipWith (+) fibs (tail fibs)
アップデート:
zipWith
例の問題は@fibs[1..*]
スライスのようです。tail
として定義されている場合はsub tail (@x) {my $i = 1; {@x[$i++]}...*}
、正しく機能します。Rakudoの内部に精通している人からスライスが怠惰ではない理由を知りたいと思います。
もう1つの素晴らしいものは次のとおりです。
my @fibs := (0, [\+] 1, @fibs);