gpt4 book ai didi

r - Scala中的管道运算符

转载 作者:行者123 更新时间:2023-12-03 21:31:38 26 4
gpt4 key购买 nike

我想知道是否可以定义像 %>% 这样的管道运算符在 magrittr R 的包装语言。我发现了几个类似的实现,如下所示:

implicit class PipelineContainer[F](val value: F) {
def |>[G] (f: F => G) = f(value)
}

这样 x |> f |> gg(f(x)) 一样工作

现在我希望这个运算符即使在函数接受多个参数时也能工作,在这种情况下,管道参数左侧的值成为右侧函数的第一个参数。例如, x |> f(2) |> g(3)变成 g(f(x, 2), 3) .我怎样才能在scala中实现这个?它不必与我在这里展示的语法相同,但越简单越好。

最佳答案

有几个选项。

一种是只创建内联函数。它只是有点乱。

x |> (z=>f(z,2)) |> (z=>g(z,3))

另一个是创建可以折叠现有函数的arity 的快捷方法。一般来说,它有很多样板,但第一个很容易:
implicit class RichPipes[Y](y: Y) {
def |>[Z](f: Y => Z) = f(y)
def &>[X, Z](f: (X, Y) => Z): (X => Z) = (x: X) => f(x, y)
}

然后您可以内联注入(inject)其他参数(利用 & 的优先级高于 | 的事实):
x |> 2 &> f |> 3 &> g

就个人而言,我觉得这种风格令人困惑,但编译器对此很好。

另一种选择是将方法转换为函数以开始(如果需要),然后丰富这些函数以具有部分应用程序辅助方法:
implicit class RichFunction2[A,B,Z](f: (A,B) => Z) {
def %(b: B): (A => Z) = (a: A) => f(a,b)
}

现在你可以
x |> f _ % 2 |> g _ % 3

最后,如果您碰巧能够以不同的方式编写函数,您可以在没有任何额外机制的情况下使其工作,除了尾随 _让编译器知道你在做什么;不同之处在于应用程序通过了多个参数 block 中的最后一个:
def h(y: Int)(x: Int) = x + y
def i(y: Int)(x: Int) = x * y

x |> h(2) _ |> i(3) _

不过,作为最后的想法,在中途注入(inject)参数对于初学者来说可能不是最容易遵循的事情。您可能会考虑与采用不同的工作流程相比,这是否是一种好的编程实践。

关于r - Scala中的管道运算符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34646526/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com