2

そのフォーラムでの活動がはるかに少ないため、これはコースラ関数型プログラミングコースからのクロスポストです。

私は次のコードを書きました(宿題なので部品は編集されています):

type Occurrences = List[(Char, Int)]
def subtract(x: Occurrences, y: Occurrences): Occurrences = {
  val mx: Map[Char, Int] = x toMap
  y.foldLeft (redacted) (redacted => simple expression using updated and -)) toList
}

これにより、次のコンパイルエラーが発生します。

type mismatch; found : Map[Char,Int] required: <:<[(Char, Int), (?, ?)]

ただし、valステートメントを介してtoListなしで3行目のコピーを追加すると、エラーはなくなります。

type Occurrences = List[(Char, Int)]
def subtract(x: Occurrences, y: Occurrences): Occurrences = {
  val mx: Map[Char, Int] = x toMap
  val foo: Map[Char, Int] = y.foldLeft (redacted) (redacted => simple expression using updated and -))
  y.foldLeft (redacted) (redacted => simple expression using updated and -)) toList
}

これは、タイプチェッカーに何らかの追加のヒントを与えることと関係があると思いますが、なぜこれが発生するのかを具体的に知っている人はいますか?

4

2 に答える 2

3

以下に、いくつかの例と、それが発生する理由についての説明を示します。

まず、機能するケースと機能しないケース:

scala> { List('a -> 1, 'b -> 2).toMap
     | println("aaa") }
aaa

scala> { List('a -> 1, 'b -> 2) toMap
     | println("aaa") }
<console>:9: error: type mismatch;
 found   : Unit
 required: <:<[(Symbol, Int),(?, ?)]
              println("aaa") }
                     ^

これは、"obj method arg" という構文が "obj.method(arg)" と見なされ、"obj method \n arg" と見なされるため、次の行に引数を記述できるためです。以下に注意してください:

scala> { val x = List('a -> 1, 'b -> 2) map 
     | identity
     | 
     | println(x) }
List(('a,1), ('b,2))

と同じList('a -> 1, 'b -> 2).map(identity)です。

次に、奇妙なエラー メッセージについて説明しますfound : Unit, required: <:<[(Symbol, Int),(?, ?)]toMap実際には1つの引数を取ることが起こります.これがその署名です:

def toMap[T, U](implicit ev: <:<[A,(T, U)]): Map[T,U]

ただし、これは暗黙の引数であるため、この場合は明示的に指定する必要はありません。しかし、obj method \n arg構文を使用すると、メソッドの引数が埋められます。上記の動作しない例では、引数はprintlntypeUnitであるため、コンパイラによって受け入れられません。

1 つの回避策は、2 つ\nの行を区切ることです。

scala> { List('a -> 1, 'b -> 2) toMap
     | 
     | println("aaa") }
aaa

;a を使用して行を区切ることもできます。

于 2012-10-28T23:24:49.520 に答える
2

@RexKerr と @DidierDupont は正しいです。toMap二項演算子のように呼び出したために問題が発生し、コンパイラが異常終了しました。

私の 2 セント: おそらくScala Style Guide の Suffix Notation セクションを読む必要があります。

于 2012-10-28T23:15:36.167 に答える