【问题标题】:Is it possible to get the name of a partially applied function?是否可以获得部分应用函数的名称?
【发布时间】:2011-03-21 15:02:36
【问题描述】:

假设我定义了一个函数:

def hello(name:String, words:String) = println("Hello!" + name + words)

然后我定义了一个偏函数:

def p = hello _

打印 p,显示:

(String, String) => Unit = <function2>

没有显示函数名称。是否可以从偏函数p得到原方法名hello

【问题讨论】:

  • 在标签和问题标题中将“部分功能”编辑为“部分应用功能”,以便适当的人被这个问题吸引(或排斥)。
  • 添加到 Rex 的评论中,“部分函数”是一个未为其域类型中的所有输入定义的函数。规范偏函数类似于 def f(x : Int) = 1/x。 Scala 还具有 PartialFunction 特征,如果函数对象想要回答指示它们在哪里和未定义的查询,则可以实现该特征。这两个概念都不应与部分应用相混淆。

标签: scala partial-application


【解决方案1】:

最近在邮件列表上讨论了一种语言结构,该结构允许您识别当前所处的方法。它会被称为某事就像thisMethod 一样,本质上对方法的作用就像this 对类实例的作用一样。

我很想知道它如何与函数交互(这是与方法不同的概念)。您的p 是通过部分应用hello 方法创建的匿名函数(同样,您需要在这里小心,“部分应用 函数与PartialFunction 完全不同) . 然后调用的实际方法将是此函数对象上的apply,在这种情况下thisMethod 的行为方式有多种可能性。

无论发生什么,p 只是一个对象引用,不要期望永远能够以名称的形式访问它。

【讨论】:

    【解决方案2】:

    没有。

    这是一个我很想拥有的功能,但它存在严重的概念问题,例如,当同一个函数有两个名称时会发生什么......它应该仍然是同一个函数,不是吗?

    根据评论更新:

    def p = 你好_ def q = p

    q的名字是什么?吗?还是你好?或打印?我很难想象一个简单、一致且有用的解决方案。

    【讨论】:

    • 谢谢!但我不明白这个函数是如何被赋予两个名称的?我希望有一种方法说getOriMethodName 返回hello,这会导致一些问题吗?对不起,我是 scala 的新手。
    • 正式地说,我们不编写函数,而是编写计算函数的过程。 def f(x : Int) = 2 * x 和 def g(x : Int) = x + x 是计算相同函数的两个不同过程。但这只是迂腐,我认为这个答案不应该被投票,因为它超出了所要求的重点 - 一个调试工具。
    【解决方案3】:

    ... 这实际上是一个“部分应用的函数”,它是通过调用你的 hello 函数而不应用参数来匿名创建的。它没有要显示的明确名称。

    【讨论】:

      猜你喜欢
      • 2016-06-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-17
      • 2017-02-27
      • 2016-07-19
      • 1970-01-01
      相关资源
      最近更新 更多