如何用更少的括号在Scala中编写f(g(h(x))?
表达方式如如何用更少的括号在Scala中编写f(g(h(x))?,scala,coding-style,syntax,functional-programming,Scala,Coding Style,Syntax,Functional Programming,表达方式如 ls map (_ + 1) sum 它们是可爱的,因为它们是从左到右而不是嵌套的。但是如果所讨论的函数是在类之外定义的,那么它就不那么漂亮了 我试过了 据我所知,这很好,除了 一种方法需要大量的打字 你需要事先知道你想这样使用它 有什么技巧可以解决这两个问题吗?您可以调用,然后对函数对象调用: (h andThen g andThen f)(x) 但是,您不能直接在方法上调用它,因此您的h可能需要变成(h),才能将该方法转换为部分应用的函数。编译器将自动将后续方法名称转换为函数
ls map (_ + 1) sum
它们是可爱的,因为它们是从左到右而不是嵌套的。但是如果所讨论的函数是在类之外定义的,那么它就不那么漂亮了
我试过了
据我所知,这很好,除了
有什么技巧可以解决这两个问题吗?您可以调用
,然后对函数对象调用:
(h andThen g andThen f)(x)
但是,您不能直接在方法上调用它,因此您的h
可能需要变成(h)
,才能将该方法转换为部分应用的函数。编译器将自动将后续方法名称转换为函数,因为和方法接受函数参数
您还可以使用|>
编写如下内容:
x |> h |> g |> f
使用隐式转换丰富现有类/接口(这是您使用doubleToDoublePlus
所做的),这完全是关于在某些类不受您控制时的API设计。我不建议仅仅为了省去一些击键或者少一些括号就轻易地这样做。因此,如果能够键入val h=d hypot x
很重要,那么额外的击键就不应该引起关注。(可能存在对象分配问题,但情况不同)
标题和您的示例也不匹配:
f(g(h(x))
可以重写为f uu组合g u组合h u应用x
如果您关心的是括号,或者f组合g组合h应用x
如果f,g,h是函数对象而不是def
但是ls-map(+1)sum
并不像您所说的那样是嵌套调用,所以我不确定这与标题有什么关系。尽管它使用起来很可爱,但库/语言设计师们花了大量的精力使它易于使用,而且它并不简单(比您的Hypto示例复杂得多)。也许这一点,请观察它是如何提供的:
def compose[A,B,C](f:B=>C,g:A=>B):A=>C=(A:A=>f(g(A))
基本上就像上面的答案一样,将所需的函数组合到一个中间函数,然后您可以轻松地使用map 从Scala 2.13开始,标准库提供了链接操作,可用于转换/导入具有感兴趣函数的值
因此,使用多个管道
s,我们可以构建一个管道
,正如您问题的标题中所提到的,该管道可以最大限度地减少括号的数量:
import scala.util.chaining._
x pipe h pipe g pipe f
从某种意义上说,它们是嵌套调用:每个步骤的结果成为下一个调用的this
参数。在其他语言中,这种嵌套是显式的。我的问题是,虽然一个特定的参数是否是这个参数在功能上不是很重要,但仅仅是因为这个事实,您得到了很好的调用语法。在实用程序对象中定义hypot,然后用作hypot(3,4)
有什么不对?似乎是这里最好的选择。
def fgh (n: N) = f(g(h(n)))
val m = fgh (n)
import scala.util.chaining._
x pipe h pipe g pipe f