繁体   English   中英

如何“应用”无参数函数的结果

[英]How do I “apply” to results of a parameter-less function

这有效:

List(3, 1, 2).sorted apply 1
res1: Int = 2

这有效:

var x = List(3, 1, 2).sorted
x: List[Int] = List(1, 2, 3)
x(1)
res2: Int = 2

但这不是:

List(3, 1, 2).sorted (1)

error: type mismatch;
 found   : Int(1)
 required: Ordering[?]
       List(3, 1, 2).sorted (1)
                             ^

甚至括号也不能解析解析器到我想要的东西:

(List(3, 1, 2).sorted)(1)

error: type mismatch;
 found   : Int(1)
 required: Ordering[?]
       (List(3, 1, 2).sorted)(1)

这似乎是一种自然的表达。 我究竟做错了什么?

这有效:

(Listed(3, 1, 2).sorted _)(1)

但我不确定使用它是否比使用起来更方便:

Listed(3, 1, 2).sorted apply 1

无论如何我会选择后者。

我认为你必须保留申请。 原因是排序不是 “无参数”,它被定义为

def sorted [B >: A] (implicit ord: Ordering[B]) : List[A]

由于这是一个隐式参数,Ordering [Int]通常是自动提供的,但是如果你使用parens,编译器会认为你想要指定另一个Ordering [Int](让我们说倒退)。

可以通过以下方式提供所需的参数:

List(3, 1, 2).sorted(implicitly[Ordering[Int]])(1)

虽然使用apply()看起来更短,更不可怕。

你能做到的最短 - 不是没有很小的性能损失 - 是

class Allow_\[A](a: A) { def \ = a }
implicit def allowEveryone[A](a: A) = new Allow_\[A](a)

scala> List(1,3,2).sorted\(1)
res0: Int = 2

如果你可以接受另一个角色,这可能会更好:无论如何, <>看起来像是parens,并且可以读作“请填写像往常一样的隐式参数”:

class Allow_<>[A](a: A) { def <> = a }
implicit def allowEveryone[A](a: A) = new Allow_<>[A](a)

scala> List(1,3,2).sorted<>(1)
res0: Int = 2

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM