5

Scalaで型パラメーターを使用してメソッドを呼び出すとき、型推論子が型パラメーターについて自分自身を見つけて入力する必要がないようにコードを配置しようとすることがよくあります。状況によっては失敗し、手動で提供する必要があります。

ほとんどの場合、これは問題ではありませんが、いくつかの型パラメーターを持つメソッド(たとえば、暗黙を必要とするほとんどのメソッドCanBuildFrom)の場合、必要な型の1つだけを与えることによって型推論を支援する方法があるかどうか疑問に思いました。パラメータ、および他のものを推測してみるように依頼します。A[B, ?]内部的には、「expected type but got 」という形式のエラーメッセージが生成されることがあるため、内部的にはそのようなことをしている必要がありますA[C, D]。これは、の2つの型パラメータのAうち、最初のパラメータを見つけることができますがB、 2番目のものについての情報はありません。

ユースケース: Tomaszの質問、このコード:

def firstAndLast[CC, A, That](seq: CC)(implicit asSeq: CC => Seq[A], cbf: CanBuildFrom[CC, A, That]): That = {
  val b = cbf(seq)
  b += seq.head
  b += seq.last
  b.result
}

で呼び出すことはできませんがList("abc", "def") map firstAndLast、これは機能します。

List("abc", "def") map firstAndLast[String, Char, String]

この例では、私の質問は次のように要約されます。型推論器にCCパラメーターが必要であることを伝え、Stringそれ自体を調べてもらう方法はAありThatますか?本質的には、

List("abc", "def") map firstAndLast[CC = String]

また

List("abc", "def") map firstAndLast[String, <guess>, <guess>]

私はこれらの行が機能しないことを知っています。私は回避策を探しています(または、これまでに議論され、これにつながる可能性のある将来の言語機能へのポインターを探しています)。

4

1 に答える 1

1

いいえ、できません。型 (クラスやトレイトなど) に役立つtype lambdaとそれ自体がありますが、型パラメーターには役立ちません。type例えば:

// Declaring a type alias
type StringMap[Elem] = Map[String, Elem]

// Calling an `def f[M[_]]` but passing a `Map`
f[({type l[A]=Map[String,A]})#l]

// note that f could also be called like this:
f[StringMap]
于 2012-05-28T16:19:50.710 に答える