1

私はscalaを初めて使用するので、この基本的な初心者の質問を許してください。次のコードスニペットがあります。

type Pred[A, B] = (A, B) => Int;
def abs[A, B](p: (A, B) => Int): (A, B) => Int =
  (a, b) => if (p(a, b) < 0) -(p(a, b)) else (p(a, b));
def multiply(a: Int, b: Int): Int =
  a * b;
def subtract(a: Int, b: Int): Int =
  a - b;

val absMultiply = abs(multiply);
val absSubstract = abs(subtract);

println("abs(10 * 10) = " + absMultiply.apply(10, 10));
println("abs(10 - 100) = " + absSubstract.apply(10, 100));

したがって、私はそれを正しく理解しているので、(A、B)=> IntをPred[A、B]に置き換えることができるはずです。

def abs[A, B](p: Pred[A, B]): Pred[A, B] =
  (a, b) => if (p(a, b) < 0) -(p(a, b)) else (p(a, b));

しかし、コンパイラの例外が発生します

type mismatch;  found   : (Int, Int) => Int  required: (A, B) => Int    
type mismatch;  found   : (Int, Int) => Int  required: (A, B) => Int    

私はここで何か間違っていると誤解しましたか?

ご助力ありがとうございます。

キリル

4

1 に答える 1

2

AとBを反変型として宣言すると機能します。

type Pred[-A, -B] = (A, B) => Int

multiplysubtract関数がPred[A、B]のサブタイプと見なされるため、これらの引数はAとBのスーパータイプでなければならないため、これが必要です。この主題に関する優れた説明については、この回答を参照してください。

于 2013-03-27T03:14:54.883 に答える