2016-10-15 9 views
0

タイプの制約は、次のタイプとして実装されています:スカラーコンパイラが証拠パラメータ型を推論しないのはなぜですか?

abstract class <:<[-From, +To] extends Function1[From, To] 
    object <:< { 
    implicit def conforms[A] = new (A <:< A) { def apply(x: A) = x } 
    } 

私たちは、このように我々のコードで証拠を使用します。

def firstLast[A, C](it: C)(implicit ev: C <:< Iterable[A]) = 
(it.head, it.last) 

私はapply方法コンパイラはitheadとが含まれていないことを言ってクリアしたときにlastですが、暗黙の型解決はすでに成功していました。これは、CがIterable [A]のサブタイプであることを意味します。しかし、コンパイラはそれを推論することはできません。 Scalaの型推論は十分強力ではありませんか?

+0

あなたが記述しているエラーを引き起こすのはどのようなコードですか?最初の赤面では、これは意図したとおりに動作するように見えます。 –

+0

'<:<'はスカラで使用できるデフォルトの演算子ですが、なぜあなたはカスタムbtwに行くのですか? – flavian

+1

eclipseやintellijのようなIDEによって与えられたエラーについては言及していません。 –

答えて

0

私は理解していません...あなたはこれで間違っていますか?それは正常に動作しています

scala> :pa 
// Entering paste mode (ctrl-D to finish) 

def firstLast[A, C](it: C)(implicit ev: C <:< Iterable[A]) = (it.head, it.last) 

// Exiting paste mode, now interpreting. 

firstLast: [A, C](it: C)(implicit ev: <:<[C,Iterable[A]])(A, A) 

scala> firstLast(List(1,2,3)) 
res0: (Int, Int) = (1,3) 
関連する問題