运维开发网

Scala与F#中的|>或Clojure中的 – >>等价

运维开发网 https://www.qedev.com 2020-07-28 08:49 出处:网络 作者:运维开发网整理
在 Scala中,当我有这个表达时 f1 ( f2 ( f3 (p))) 有没有办法让我可以使用像 F# p |> f3 |> f2 |> f1 还是Clojure? (->> p f3 f2 f1) 如果你想在不使用外部库的情况下自己编写, implicit class Pipe[T](x: T) { def |> [U](f: T=>U): U = f(x) } 因此,此隐式类模式用于扩展
在 Scala中,当我有这个表达时

f1 ( f2 ( f3 (p)))

有没有办法让我可以使用像

F#

p |> f3 |> f2 |> f1

还是Clojure?

(->> p f3 f2 f1)
如果你想在不使用外部库的情况下自己编写,

implicit class Pipe[T](x: T) {
  def |> [U](f: T=>U): U = f(x)
}

因此,此隐式类模式用于扩展方法.它是“皮条客我的图书馆”模式的简写:

class Pipe[T](x: T) { /*extension methods here*/ }
implicit def anyToPipe[T](x: T) = new Pipe(x)

与任何隐式转换一样,如果方法名称对T无效,但有一个函数T =>管道在隐式范围内,并且该方法在Pipe上有效,编译器插入函数(或此处的方法 – 实际上是相同的东西),以便获得Pipe实例.

def |> [U](f: T=>U): U = f(x)

这只是一个名为|>的方法.具有类型T => U的参数f,即Function1 [T,U],其中T是输入类型,U是结果类型.因为我们希望这适用于任何类型,我们需要通过添加[U]使方法在U上进行类型参数化. (如果我们使用T => Any,我们的返回类型为Any,这将没有多大用处.)返回值只是将函数应用于原始值,如果需要.

0

精彩评论

暂无评论...
验证码 换一张
取 消