Scala 方法调用的延迟类型推断

Scala 方法调用的延迟类型推断,scala,type-inference,implicit,Scala,Type Inference,Implicit,我正在读乔希·苏雷思(Josh Suereth)写的(很棒的)帖子。特别有趣的是关于延迟集合类型推断的部分 现在我想知道这是否也适用于非集合。以下两种方法创建一个Foo[T,O] def sort1[T, O](from: T, to: T)(implicit ev: O <:< Ordering[T], ord: O):Foo[T,O] = { ... } def sort2[T, O <: Ordering[Int]](from: T, to: T)(implici

我正在读乔希·苏雷思(Josh Suereth)写的(很棒的)帖子。特别有趣的是关于延迟集合类型推断的部分

现在我想知道这是否也适用于非集合。以下两种方法创建一个
Foo[T,O]

def sort1[T, O](from: T, to: T)(implicit ev: O <:< Ordering[T], ord: O):Foo[T,O] = {
   ...
}

def sort2[T, O <: Ordering[Int]](from: T, to: T)(implicit ord: O):Foo[T,O] = {
   ...
}

def sort1[T,O](from:T,to:T)(隐式ev:O事实上,这似乎是不直观的

原因是sort1没有对O定义任何约束,因此“ord:O”是不明确的。 (第一个隐式参数上的约束仅定义“ev”类型上的约束)


希望它能有所帮助:)

推迟使用类型推断就是要绕过类型推断的限制。这些限制不一定是错误,它们可以是设计出来的

我能想到两种常用的情况,它们是有用的:

  • 您希望在另一个更高级的类型中获取该类型,但获取该类型没有任何约束

    例如:

    def sort[T, Coll <: SeqLike[T, Coll](a: Coll): Coll
    
    注意:这只是一种方法。通常有一种方法可以在没有隐含证据的情况下,让同一件事非常接近。这就是:

    def sort[T, Coll <: SeqLike[T, Coll]](a: Coll with SeqLike[T, Coll]): Coll
    

    在这种情况下,
    sort2
    似乎是最好的方法。

    其他链接我认为答案是“两者都不是”:使用
    def sort[T](from:T,to:T)(隐式order:Ordering[T]):Foo[T,Ordering[T]=…
    (如果不需要直接使用
    ord
    ,请参见上下文边界)@LuigiPlinge我考虑过这一点。但对我来说,创建Foo使用的顺序很重要。例如,一个函数
    compose(foo1,foo2)
    应该只接受
    Foo
    ,并使用博客提到的相同
    Ordering
    进行排序,以避免指定类型参数的数量。我只是注意到了这一点。您可以选择[列表],但不能选择[映射]。用例是Map.mapValues.toMap返回自身;我想要的是与.view.force或.iterator.toMap不同的习惯用法。@som snyt遗憾的是,在请求类型时可以避免指定类型参数的数量,但在请求类型构造函数时不能指定。我会杀死一个
    def to[Coll[*]]=macro to_Impl
    ,该模式匹配类型参数的数量(包括0),并查找正确的隐式表达式。。。
    def sort[T, Coll <: SeqLike[T, Coll]](a: Coll with SeqLike[T, Coll]): Coll
    
    def sort3[T, O](from: T, to: T)
      (implicit ev: O <:< Ordering[T], ord: O with Ordering[T]):Foo[T,O]