2017-04-13 7 views
8

私が始点と終点を知っているシーケンスがあり、ジェネレータが単純であるとします。私はそれを怠惰にすることはできますか?Perl 6で有限リストを怠けることはできますか?

my @b = 0 ... 3; 
say 'Is @b lazy? ' ~ @b.is-lazy; # Not lazy 

私は自分自身で倍の数が不明なリストを知られているが、すぐに全体のリストを生成しない組み合わせにしたいと思います。

my @cross = [X] @b xx $n; 

は、私は他の単純な事項やプログラミングを介してこれを行うことができます知っている(と私はPerl 5 Set::CrossProductはまさにそれを行います)が、いくつかの簡単で、意図した方法がある場合、私は好奇心が強い:私は@crossは怠け者になりたいです私は行方不明です。私自身は数え切れません。

逆の質問として、それは怠け者になるシーケンスの特徴は何ですか?それは単なる終点ですか?ジェネレータが間に無限の値を作ることができるなら、まだ怠惰かもしれない既知のエンドポイントを持つシーケンスがありますか?どのくらいの情報を削除して、このような情報を試してみたのかと思った。

my $m = @*ARGS[0]; 
my @b = 0, * + $m ...^* > 3; 
say 'Is @b lazy? ' ~ @b.is-lazy; 
say '@b: ' ~ @b; 

これは怠け者ではない。

答えて

5

私の意見では、 "is-lazy"メソッドは実際には誤称です。 cuonglmが指摘したように、それが言うところの唯一のことは、基本的なイテレータが怠け者であると主張していることです。しかし、まだは何も意味しません。イテレータは技術的に要求に応じて値を生成できますが、それでも怠け者ではないと主張します。およびその逆。

"is-lazy"チェックは内部的に使用され、要素の数を事前に知る必要がある場合(例:.rollまたは.pick):Seq/iteratorが怠け者であると主張した場合、実際に試してみますが、代わりに失敗したり投げたりします。

.lazyはない唯一のものは、(与えられたイテレータは、それは当然のことながら、怠惰ではないと主張している場合)請求が怠惰であることをないことを別のイテレータに配列のイテレータをラップです。 実際にが必要な場合を除いて、値を取得しないようにしてください。したがって、.lazyを追加しても値がいつ生成されるのかは分かりません。また、イテレータベースのロジックをテストする際に、怠け者であると主張するイテレータでどのように動作するかを確認するのに役立ちます。

何かが怠け者であることを確認したい場合は、自分でイテレータを作成する必要があります。言いましたが、過去数ヶ月間は、可能な限り怠惰なものにするためにかなりの努力をしました。とりわけxx Nはまだ怠け者ではありませんが、最近ではSeqが生成されています。それを怠け者にすると、私はまだ理解できていない深いレベルでいくつかの賞賛を破った。今後は、一般的に意味があるように物事が怠け者になることを確信できると思います。おそらく、CPUよりもメモリを優先する可能性があるかもしれません。しかし、組み込み関数を完全に制御することはできません。完全に制御したい場合は、自分で書き直す必要があります。

5

はい、あなたはlazy methodを使用して、次のことができます。

> my @b = (0 ... 3).lazy; 
[...] 
> say 'Is @b lazy? ' ~ @b.is-lazy; 
Is @b lazy? True 

それは怠惰にさせる何も特別なSeq、ちょうどその基礎となるIteratorはありませんがありません。

+0

Huh。私はそれを試みたと確信していた。ありがとう! –

1

すでに指摘したように、is-lazyは実際に何も意味しません。

しかし、から期待できることの手がかりを与えるpage on rakudo wikiがあることを言いたいと思います。

1

あなたは作ることができます。

my @b = 0 ... 3; 

怠惰ちょうどこのように、正しい場所にlazyキーワードを追加することによって:

my @b = lazy 0 ... 3; 

あるいは、cuonglmが指摘したように、あなたが呼び出すことができます次のような範囲の方法です:

my @b = (0 ... 3).lazy; 
関連する問題