【发布时间】:2012-02-26 15:36:41
【问题描述】:
我很难弄清楚如何从 Scala 高阶函数定义跳转到提供的示例。它是在this slide showslide 81 上提供的。
高阶函数定义如下:
trait X[A] { def map[B](f: A => B): X[B] }
以下是提供的示例:
(1 to 10) map { x => x * 2 } // evaluates to Vector(2, 4, ..., 20)
(1 to 10) map { _ * 2 } // shorthand!
嗯?!我在这里缺少一些步骤。我知道这些示例可能同时利用了函数定义和一些 Scala 细节。我只是没有足够的阅读 Scala 和做出连接假设的经验。
我的背景是 Java OO。我现在正在学习 Scala 和函数式编程。这不是我不理解的第一个这样的例子。这是我第一次觉得自己有勇气发帖,知道自己看起来很无知。
我确实尝试过研究这个。首先,我查阅了 Scala 的“圣经”"Programming in Scala 2nd Edition",并试图从那里理解 if(第 165-9 页)。然后,我在 StackOverflow 上进行了搜索。我发现了几个在该地区讨论的链接。但是,没有任何东西真正向我展示了 Scala 高阶函数定义和提供的示例之间的联系,这种联系以映射到本幻灯片中特定实例的方式。
这是我在 StackOverflow 上找到的:
- Scala: Workshop Advice
- More on generic Scala functions
- Scala: How to define "generic" function parameters?
我现在才意识到我跳过了 Google,直接来到了 StackOverflow。嗯。如果你用谷歌搜索并找到正确的链接,我很乐意看到它。我已经没有时间筛选所有使用猴子单子、胚胚等术语的 Google 链接,同时让我更加困惑并且不太可能尝试弄清楚这一点。
【问题讨论】:
-
难怪......这些例子完全与假特征定义相矛盾。请注意,
X[A].map的结果应该是X[B],但在示例中,Range.map的计算结果为Vector[Int]!发生这种情况是因为Range的map首先没有该类型签名。我建议你看看@retronym 的答案,它完全忽略了这个例子,并从基本的类定义中重新解释了这个概念。 -
圣心皮隧道综合症!这么多答案。太棒了!感谢 Daniel 的指导。
标签: java scala higher-order-functions