- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在他的演讲中Simple Made Easy ,Rick Hickey 谈论“点菜多态”(视频中约 30:00)。在同一上下文中,他还提到了 Haskell 的 Type Classes和 Clojure 的 Multi-Methods (和协议(protocol))。
由于我对这些概念不太熟悉,我想了解它在尝试实现简单性时的用处。我对 Scala 中这个概念的任何示例或展示特别感兴趣。
最佳答案
您可以将点菜多态视为按需多态。
Clojure 社区对“点菜多态”一词感到自豪,因为 Clojure 支持多种多态策略。其中一些是:
继承多态
这就是Java使用的多态策略。 Clojure 通过代理支持这一点。在进行 Java 互操作时很有用。
协议(protocol)
Clojure 的协议(protocol)就像 Haskell 的 TypeClass。
多种方法
虽然协议(protocol)根据第一个参数的类型提供多态调度,但多方法更加灵活,可以根据方法的(任何)参数的任何函数进行调度。
多态性点菜意味着“选择最适合您情况的多态性策略。它们都在您的工具箱中。”
您可以使用隐式在 Scala 中实现 TypeClass
模式。阅读 Scalaz source如果你想要现实世界的例子。 Scala 不支持语言级别的多方法,但我想在即将推出的 2.10 宏的帮助下这是可能的。
至于好处,TypeClass、Multimethod等高级多态策略可以帮助解决 Expression Problem 。
"The goal is to define a datatype by cases, where one can add new cases to the datatype and new functions over the datatype, without recompiling existing code, and while retaining static type safety (e.g., no casts)".
顺便说一句,这个问题太大了,无法用单个 StackOverflow 问题来解决。我的建议是熟悉这些概念,然后你就会理解它们的用处。
关于scala - 什么是 "polymorphism a la carte"以及我如何从中受益?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13553100/
我是一名优秀的程序员,十分优秀!