質問

私はScalaプログラミング言語を非常に初めてであり、講義ノートをフォローしている間、私の心に何かを刺してみました ここ.

私はCons Operatorがどのように機能するかを本当に理解できなかったと思います、ここに私が試したいくつかのことがあります:

擬似ランダム番号ジェネレーターを作成し、1つのランダム値のリストを作成しようとしました。

scala> val gen = new java.util.Random
gen: java.util.Random = java.util.Random@1b27332

scala> gen nextInt 3 :: Nil
<console>:7: error: type mismatch;
 found   : List[Int]
 required: Int
       gen nextInt 3 :: Nil
                     ^

ただし、リスト(3)をNextNTメソッドに渡そうとしました。私がパラテスを使用したとき、問題はありませんでした

scala> (gen nextInt 3) :: Nil
res69: List[Int] = List(1)

私は実行命令に興味があったので、それをチェックするための関数を作成しました

scala> def pr(i:Int):Int = { println(i); i }
pr: (i: Int)Int

scala> pr(1) :: pr(2) :: pr(3) :: Nil
1
2
3
res71: List[Int] = List(1, 2, 3)

出力に見られるように、実行順序は外観の順序と同じです。それから私はそれが「nextint」関数に関するものかもしれないと思った後、次のことを試みました:

scala> 1 + 2 :: Nil
res72: List[Int] = List(3)

最初に追加され、その短所が実行された後。だからここに質問があります:の間の違いは何ですか gen nextInt 3 :: Nil1 + 2 :: Nil?

役に立ちましたか?

解決

ここには2つの懸念事項があります。 優先順位固定性. 。 SEPP2Kが述べたように、Stack Overflowに関するこの質問は優先順位を説明し、引用されているように規則は十分に完全ではないと考え、Scala 2.7からScala 2.8への非常に小さな変更がありました。違いは、主に終了するオペレーターに関するものです =, 、 けれど。

はどうかと言うと 固定性, 、Scalaのほとんどすべてが左から右に読まれます。これがプログラマーが慣れているものです。ただし、Scalaでは、オペレーターが終了します : 左に読まれます。

次に、この例を考えてみましょう。

1 + 2 :: Nil

まず、優先順位。最も優先されるものは、 + また :?テーブルによると、 + 優先順位があります :, 、したがって、追加が最初に行われます。したがって、式はこれに等しくなります。

((1).+(2)) :: Nil

現在、優先順位の競合はありませんが、それ以来です :: で終わります :, 、それは異なる固定性を持っています。したがって、右に読まれます。

Nil.::((1).+(2))

一方、これで:

gen nextInt 3 :: Nil

オペレーター :: 優先順位があります nextInt, 、 なぜなら : すべての文字よりも優先されます。したがって、その固定性を覚えていると、次のようになります。

gen nextInt Nil.::(3)

それはそうなります

gen.nextInt(Nil.::(3))

その時点でエラーは明らかです。

PS:私は書いています (1).+(2) それ以外の 1.+(2) なぜなら、この執筆時点で、 1. 二重番号、作成として解釈されます 1.+(2) Double 1.0を2に追加するInfix式は、SCALA 2.10.0の時点で非推奨であり、おそらくScala 2.11には存在しません。

他のヒント

それは、実行命令ではなく優先順位についてです。 + よりも優先されます ::, 、 それで a + b :: c as (a + b) :: c. 。ただし、通常の名前を持つInfixメソッド呼び出しの優先順位は低いため a foo b c as a foo (b c).

見る この質問 Scalaで優先順位を付けることで注文されたオペレーターのリスト。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top