1

Seq [A]の暗黙的なビューを利用する関数があります。これは、headメソッドを利用し、型を保持していることがわかります。-

scala> def needSeq[A, C <% Seq[A]](col: C) = { (col.head , col) }
needSeq: [A, C](col: C)(implicit evidence$1: C => Seq[A])(A, C)

scala> needSeq(List(1,2,3))
res0: (Int, List[Int]) = (1,List(1, 2, 3))

scala> needSeq(List("a","b"))
res1: (java.lang.String, List[java.lang.String]) = (a,List(a, b))

scala> needSeq(Array("a","b"))
res2: (java.lang.String, Array[java.lang.String]) = (a,Array(a, b))

needSeqのような関数を取り、それらを引数に適用する関数を書きたい

scala> def useFunc[A, C <% Seq[A], R](col: C)(f: C => R) = { f(col) }
useFunc: [A, C, R](col: C)(f: C => R)(implicit evidence$1: C => Seq[A])R

問題は、パラメータリストに1つのタイプ(C)しか提供されていないため、C =>Seq[A]からの暗黙のビューが利用できないためです。

scala> useFunc(List(1,2,3))(needSeq)
<console>:10: error: No implicit view available from C => Seq[A].
              useFunc(List(1,2,3))(needSeq)
                                   ^

useFuncはどのように書くべきですか?

4

2 に答える 2

2

問題は定義にありneedSeqます..
リファクタリングを試みることができるかどうか..

def needSeq[A](col : Seq[A]) = (col.head , col) 

その後、これらの両方のケースが機能します。

useFunc(List(1,2,3))(needSeq) //> res1: (Int, Seq[Int]) = (1,List(1, 2, 3))

useFunc(List(1,2,3))(x => needSeq(x)) //> res2: (Int, Seq[Int]) = (1,List(1, 2, 3))
于 2013-02-09T08:54:47.787 に答える