私は現在、 "Programming in Scala"の書籍を通じてScalaを学習しています。これまでのところ、(Javaプログラマの視点から)奇妙に見えるすべてのもののための素晴らしい説明がありましたが、フィボナッチ数列を生成するためのストリームを使用して、この一例は、一種の困惑私の葉:Stream-cons#はどのようにScalaで翻訳されていますか?
建設でどのようにdef fibFrom(a: Int, b: Int): Stream[Int] =
a #:: fibFrom(b, a + b)
ストリームの完了?もちろん、オペレータは#::
です。私はそれが:
で終わるので、右結合であると理解しますが、それはストリームの作成を説明しません。暗黙のうちに何らかの形でコンストラクタに変換されると思いますが、私はなぜ、どのように正確に見えません。
私は既にPredef.scala
とLowPriorityImplicits.scala
で答えを探しましたが、これまでのところ運がありません。
誰でも私を啓発できますか?
ありがとうございました。暗黙的な変換は、変換すべきクラスのコンパニオンオブジェクトで定義することもできないことを忘れていました。 – rolve
Scaladocにはおそらくこれらのハードコーディングされたコンパニオンインプリシットが自動的に組み込まれるべきです。 – Debilski
Scalaに新しく追加されたことは、正しい連想ではないことを指摘するかもしれません。また、ConsWrapperは[名前による呼び出し]として '#::'を実装しています(https://github.com/scala/scala/blob/v2.10.3/src/library/scala/collection/immutable/Stream。スカラ#L1042)。 #::(a) 'は、ConsWrapper(tl:⇒Stream [A])の'⇒'を 'immutable.this.Stream.consWrapper(fibFrom(b、a + b) 'fibFrom(b、a + b)'はアクセスされたときにのみ呼び出されます。 – nicerobot