5

次の方法があります。

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
}

参照: Seq[Char] ではなく Seq[T] を使用して String を返すメソッドを参照してください。最初のケースでは魅力的に機能しますが、2 番目のケースではコンパイルに失敗します。

List("abc", "def") map {firstAndLast(_)}
List("abc", "def") map firstAndLast

与える:

error: No implicit view available from CC => Seq[A].
List("abc", "def") map firstAndLast

余分なラッピングを避けるためにこの宣言を改善する方法はありますか? eta-expansion が問題のようです (?)

4

2 に答える 2

1

あなたの質問に対する完全な答えではありませんが、これが機能することに気づきました。

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

これは、型推論機能がの正しい型パラメーターを決定するのに問題があることを意味しますがfirstAndLast、それを修正する方法がわかりません…</ p>

于 2012-05-27T13:44:29.103 に答える
1

似ているように見えますが、これらは異なるものです。

List("abc", "def") map {firstAndLast(_)}
// { x => firstAndLast(x) }

List("abc", "def") map firstAndLast
// firstAndLast, if it happened to be a function

xここで、最初のケースでコンパイラーがどのように簡単にタイプできるかに注意してください。2 番目のケースでは、(seq: CC)(implicit asSeq: CC => Seq[A], cbf: CanBuildFrom[CC, A, That])が として解釈される方法を見つけようとしていますFunction1[String, ???]が、多くの情報 (型パラメーター) が欠落しているため失敗しています。

言い換えれば、最初のケースでは、コンパイラは最初xに 、したがって をタイプし、CC次に残りを理解しようとします。2 番目のケースでは、コンパイラはすべての型パラメーターを同時に把握しようとしています。

于 2012-05-28T16:13:47.420 に答える