【问题标题】:How to take a constant Integer as input in Partial Function? [closed]如何将常量整数作为偏函数的输入? [关闭]
【发布时间】:2017-12-18 05:38:51
【问题描述】:

我是 scala 的新手,我有一个用例,我想定义一个偏函数来添加三个数字,其中一个数字是常数,两个 数字可以作为输入传递并定义另一种可以采用部分的方法 函数作为输入并给出它的立方体作为结果。

【问题讨论】:

  • 那么为什么这个函数应该是部分的呢?实施它有什么问题?这似乎很容易。
  • @SergGr 我忘了提到我是 scala 的初学者,并且很难理解我们必须执行上述操作然后将该部分函数作为另一个函数的输入的用例之一并找到它的立方体
  • 我最好的猜测是你混合了两个不同的术语:“偏函数” - 这意味着函数不是为所有参数定义的,例如仅为正定义的平方根价值观;和“部分应用函数”,这意味着你有一个有很多参数的函数,然后绑定其中一些以获得更少参数的函数。
  • 我真正想问的是,是否有任何解决方法可以将部分定义的函数作为其他函数的输入,就像我们在高阶函数中所做的那样
  • 您的原始问题的最新编辑更加令人困惑。什么是函数的立方?您似乎在使用您不完全理解的词语并提出没有意义的问题。

标签: scala partial-functions


【解决方案1】:

嗯...这取决于你的常数来自哪里?

选择 1 - 您的函数形成一个闭包,其范围内存在一个常量。

val yourConstant = 10

val pf: PartialFunction[(Int, Int), Int] = {
  case (x, y) => x + y + yourConstant
}

pf((5, 10))

选择 2 - 您的函数有一个局部常量。

val pf: PartialFunction[(Int, Int), Int] = {
  case (x, y) => x + y + 10
}

pf((5, 10))

此外,正如许多其他人指出的那样 - 这看起来不像是偏函数的用例。您确定要Partial Function 而不是partially applied function 吗?

如果您正在寻找一个部分应用的函数,那么,

// first you need a curried function
// Curries function are function which can take parameters in steps to build intermidatary functions.

def normalDef(c: Int)(x: Int, y: Int): Int = c + y + x
// normalDef: normalDef[](val c: Int)(val x: Int,val y: Int) => Int

// now you can "partially apply" this "curried" function to your partially applied function

val addTo10PartiallyApplied = normalDef(10) _
// addTo10PartiallyApplied: (Int, Int) => Int = $Lambda$1240/1924827254@46202553

val total = addTo10PartiallyApplied(1, 2)
// total: Int = 13

【讨论】:

    【解决方案2】:

    以下偏函数将 12345 添加到传递给它的元组中的每个数字

    scala> val addConstantTo: PartialFunction[(Int, Int), Int] = {
         |   case (a, b) => a + b + 12345
         | }
    addConstantTo: PartialFunction[(Int, Int),Int] = <function1>
    
    scala> addConstantTo((12, 34))
    res4: Int = 12391
    

    这扩展了这个概念,通过编程定义一个向元组的元素添加任意数字的偏函数:

    scala> def addTo(c: Int): PartialFunction[(Int, Int), Int] = {
         |   case (a, b) => a + b + c
         | }
    addTo: (c: Int)PartialFunction[(Int, Int),Int]
    
    scala> val pf = addTo(3)
    pf: PartialFunction[(Int, Int),Int] = <function1>
    
    scala> pf((1, 2))
    res5: Int = 6
    

    让它沉入一点:)

    【讨论】:

    • 是的,但由于没有 定义的 (Int,Int) 域,因此将其设为 PartialFunction 有点毫无意义。我想知道 OP 是否没有阅读/理解家庭作业以及他们实际上寻找的是部分应用的功能(即柯里化)。
    • 不知道 OP 的动机是什么,不关我的事。 PartialFunctions 可以是全部函数,至少从 OO 的角度来看,因为 PartialFunction 扩展了 (A) ⇒ B;见scala-lang.org/api/current/scala/PartialFunction.html。不要求 PartialFunctions 在任何地方都是未定义的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-05
    • 2021-07-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多