我对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)=&gt; 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
我误解了这里有什么不对吗?
非常感谢你的帮助。
Cyrill
答案 0 :(得分:2)
如果您将A和B声明为逆变类型,则它有效:
type Pred[-A, -B] = (A, B) => Int
这是必要的,因为要将multiply
和subtract
函数视为Pred [A,B]的子类型,它们的参数必须是A和B的超类型。请参阅this answer for关于这个问题的一个很好的解释。