scala谓词基本

时间:2013-03-27 01:27:54

标签: scala

我对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

1 个答案:

答案 0 :(得分:2)

如果您将A和B声明为逆变类型,则它有效:

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

这是必要的,因为要将multiplysubtract函数视为Pred [A,B]的子类型,它们的参数必须是A和B的超类型。请参阅this answer for关于这个问题的一个很好的解释。