2

以下を使用して、Scalaで新しいリストを作成できます。

1 :: 2 :: Nil

私の理解では、これは次のように書き直すことができます。

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

主な理由は::fixtyですが、私が書いた場合:

Nil :: 1 :: 2

「値::はIntのメンバーではありません」というメッセージが表示されます。これは、scaladocではIntに::がないためですが、これを次のように変換すると、理由がわかりません。

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

それは出力として取得して動作します:

List(1.0, 2.0)

scalacがとをIntとは異なるタイプに自動キャスト1しているように見えます。2あれは正しいですか?もしそうなら、なぜそれが起こるのですか、そしてこの奇妙なタイプはどれですか?

4

2 に答える 2

6

これは面白い。

あなたの表現

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

コンパイラによって次のように解析されています

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

これは、::右結合であるため、と同じです。

1. :: 2. :: Nil

これ1.は、を書くための有効な方法であるためDouble、と同じです。

1.0 :: 2.0 :: Nil

これは、List[Double]

List(1.0, 2.0)
于 2012-05-20T03:24:02.003 に答える
0

あなたはその表現を書く

1 :: 2 :: Nil

次のように書き直すことができます

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

2.はとして解析されるため、これは完全には正しくありませんDouble。これは、2の周りに括弧を追加することで修正できますが、クラスIntはメソッドをサポートしていないため、コンパイラは引き続き文句を言い::ます。

与えられた式は次のように書くことができます

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

あなたが持っている他の表現は

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

ここで、コンパイラは解析1.2.てdoubleとして使用します。つまり、トークンを読み取るときにできるだけ多くの文字を熱心に消費します。それを避けたい場合は、整数を括弧で囲むか、数値とドットの間に空白を追加することができます。

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

ただし、::クラスのメンバーではないためInt(または、暗黙的な変換が存在するクラスのメンバーでもないため)、これらの式でもエラーが発生します。

于 2012-05-22T20:43:52.097 に答える