【问题标题】:Combining partial functions组合部分函数
【发布时间】:2016-08-18 16:44:11
【问题描述】:

我来自 Java,想像这样组合两个部分函数:

def sum(a: Int, b: Int, c: Int) : Int = a + b + c

我想写这样的东西:

val l = List(1, 2, 3)
l.foreach(println _  sum (1, _ : Int, 3) ) // It's supposed to apply
                                  // the partial sum(1, _: Int, 3) 
                                  // and println computed value.

但它拒绝编译。有没有办法简洁地修复它?

【问题讨论】:

  • 您将部分评估函数(类似于f(1,_))和部分函数混合在一起。 sum 是一个完整的函数,而不是部分函数,​​这意味着对于函数的每个域元素,在其 codomain 中都有一个关联元素。
  • @pedrofurla 部分应用函数,对。我不会编曲,可以吗?
  • 第二行没有意义。不确定是否值得尝试解释原因。
  • 当然可以。但是您的代码不是在组合函数,而是在应用值、函数和元组,或者实际上是在尝试。
  • 好的,我想我明白你想要什么了。

标签: scala function partial-functions


【解决方案1】:

您尝试执行的操作几乎没有问题。首先,println 是一个重载方法,因此当您尝试将其 eta 扩展为像这样的函数 println _ 时,Scala 采用最短的形式,即具有 0 个参数的形式:

scala> println _
res0: () => Unit = $$Lambda$1048/48841776@58ec44ec

所以你需要更具体:

scala> println(_: Int)
res1: Int => Unit = $$Lambda$1064/1621799037@1e8bddc4

现在我们有了正确的函数,还有一件事要做:添加compose 和适当的括号(额外的括号包裹匿名函数):

scala> l.foreach((println(_: Int)) compose  (sum (1, _: Int, 3)))
5
6
7

或在另一个方向:

scala> l.foreach((sum (1, _: Int, 3)) andThen (println(_: Int)))
5
6
7

【讨论】:

    【解决方案2】:

    假设我正确阅读了您想要的内容(甚至代码也是一个巨大的假设),这里有一个可能实现它的 sn-p:

    scala> def sum(a: Int, b: Int, c: Int) : Int = a + b + c
    sum: (a: Int, b: Int, c: Int)Int
    
    scala> val sum13 = sum(1, _ : Int, 3)
    sum13: Int => Int = <function1>
    
    scala> val printInt = println( _ : Int )
    printInt: Int => Unit = <function1>
    
    scala> List(1,2,4) foreach { printInt compose sum13 }
    5
    6
    8
    

    注意compose。另一种方法是显式撰写x =&gt; printInt(sum13(x))

    【讨论】:

    • Thatnks,但为什么 printFoo compose sum (1, _ : Int, 3) 不起作用?
    • @user3663882 尝试在 sum 周围加上显式括号
    猜你喜欢
    • 2013-10-07
    • 1970-01-01
    • 2011-12-02
    • 1970-01-01
    • 1970-01-01
    • 2021-06-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多