Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何用更少的括号在Scala中编写f(g(h(x))?_Scala_Coding Style_Syntax_Functional Programming - Fatal编程技术网

如何用更少的括号在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