0

私は存在型を試しています。

その seq の要素がすべて同じ型であるシーケンスを期待する関数で遊んでいました。私は持っていた..

def bar[X](as: Seq[A[X]]) = true

どこ ...

// parametised type to use in the question
trait A[T]

次に、「forSome」構文に出くわし、それで同じ制約を達成できることがわかりました。

比較のために以下に書きました...

// useful types 
trait A[T]
class AI extends A[Int]
class AS extends A[String]

// define two functions that both have the same constraint.
// ie the arg must be a Sequence with all elements of the same parameterised type

def foo(as: Seq[A[X]] forSome { type X }) = true

def bar[X](as: Seq[A[X]]) = true

// these compile because all the elements are the same type (AI)
foo(Seq(new AI, new AI))
bar(Seq(new AI, new AI))

// both these fail compilation as expected because 
// the X param of X[A] is different (AS vs AI)
foo(Seq(new AI, new AS))
bar(Seq(new AI, new AS))

私が理解しようとしているのは、何か不足していますか? ある署名が他の署名よりも優れている点は何ですか。

明らかな違いの 1 つは、コンパイル エラーが異なることです。

scala> foo(Seq(new AI, new AS))
<console>:12: error: type mismatch;
 found   : Seq[A[_ >: String with Int]]
 required: Seq[A[X]] forSome { type X }

              foo(Seq(new AI, new AS))
                     ^

scala> bar(Seq(new AI, new AS))
<console>:12: error: no type parameters for method bar: (as: Seq[A[X]])Boolean e
xist so that it can be applied to arguments (Seq[A[_ >: String with Int]])
 --- because ---
argument expression's type is not compatible with formal parameter type;
 found   : Seq[A[_ >: String with Int]]
 required: Seq[A[?X]]
              bar(Seq(new AI, new AS))
              ^
<console>:12: error: type mismatch;
 found   : Seq[A[_ >: String with Int]]
 required: Seq[A[X]]
              bar(Seq(new AI, new AS))
                     ^

scala>
4

1 に答える 1

0

違いは、 ではfootype を参照できないXのに対し、 では次のbarことができることです。

// fails
def foo(as: Seq[A[X]] forSome { type X }) = Set.empty[X]

// btw the same:
def foo(as: Seq[A[_]]) = Set.empty[???]  // <-- what would you put here?

// OK
def bar[X](as: Seq[A[X]]) = Set.empty[X]
于 2013-04-25T23:00:09.263 に答える