与正常参数相比,Scala“上下文绑定”的优势是什么?

时间:2014-03-06 22:35:16

标签: scala implicits context-bound

我正在阅读应该像类型类一样工作的上下文边界和隐式参数。我看到的示例经常使用Ordering[T]。类似的东西:

foo[T : Ordering](a: T, b: T)

是糖的

foo[T](a: T, b: T)(implicit ord: Ordering[T]) 

所以在身体中你可以做类似

的事情
ord.compare(a, b)

我以为我之前已经理解了这一点,现在我正在画一个空白...简单的优点是什么 将事物传递给函数。例如:

foo[T](a: T, b: T, ord: Ordering[T])
/* or */ foo[T](a: T, b: T)(ord: Ordering[T])
foo(a, b, myOrdering)
/* or */ foo(a, b)(myOrdering)

1 个答案:

答案 0 :(得分:4)

我试着在下面详细解答。简短的回答是不必将隐式值明确地传递给其他方法的隐式参数。

据我所知,你不介意上下文边界的语法糖,你理解这一点,所以我只是跳过那一部分。

想象一下,您有两种排序方法,一种是对整个数组进行排序,另一种是仅排序一部分。他们有以下签名:

sort[T](as: Array[T], ord: Ordering[T]): Unit = sort(as, 0, as.length, ord)
sort[T](as: Array[T], from: Int, to: Int, ord: Ordering[T]): Unit = ???

现在,如果存在Ordering隐式值并且存在类似隐式参数:

sort[T](as: Array[T])(implicit ord: Ordering[T]): Unit = sort(as, 0, as.length/*)( ord*/)
sort[T](as: Array[T], from: Int, to: Int)(implicit ord: Ordering[T]): Unit = ???

或上下文界限:

sort[T:Ordering](as: Array[T]): Unit = sort(as, 0, as.length/*)( ord*/)
sort[T:Ordering](as: Array[T], from: Int, to: Int): Unit = ???

看,我们没有必要指定一般情况的顺序。您可以通过参数的更深度传递来想象这一点。在这种情况下,使用更容易,尽管没有上下文绑定的声明有点繁琐。

(为了完整性获取具有上下文绑定的实例:implicitly[Ordering[T]],在???实现中的某个位置。)