私はスカラの初心者です...無知を仮定します。そうは高次の型を暗黙的に変換します
Iは<の定義を見れば:<
sealed abstract class <:<[-From, +To] extends (From => To) implicit def conforms[A]: A <:< A = new (A <:< A) {def apply(x: A) = x}
、これはタイプAはB.
<のサブタイプであることの証拠を定義するために使用される:B
を...しかし、もし私がその証拠を持っていたいなら、 B [T]
:T. A [T] < FORALL
?
OK ....ので、私は同じレシピ
abstract class Foo[-A[_],+B[_]] { def apply[C](x : A[C]) : B[C] }
implicit def conforms[A[_]] : Foo[A,A] = new Foo[A,A] { def apply[C](x : A[C]) : A[C] = x }
に従うことをしようと、私は手動で変換を適用し、この制約を使用することができますが、私は暗黙のうちにそれを「適用」するようにコンパイラを取得することはできません。 (A => Bを拡張しないため)
などです。
abstract class FooInt[-A[_],+B[_]] extends (A[Int] => B[Int])
implicit def conformsInt[A[Int]] : FooInt[A,A] = new FooInt[A,A] { def apply(x : A[Int]) : A[Int] = x }
その後、コンパイラが自動的にタイプA [INT]の値に変換を適用します
私はちょうど[T]の考えにこれを一般化したい
?
をあなたが求めているものは不明です。 'Foo'のユースケースを追加して、どこに行きたいのかを理解する必要があります。 F#はHM型であるのに対し、Scalaは名目上型付けされていることに注意してください。混乱はそこから起こると思う。 –
hmmm ...私は考えてみましょう実際に完全な例を与える問題はすべてそれが泥の中に隠れているということです – user2088029
暗黙の変換は私たちが "A => B"を実装すると仮定しているということです – user2088029