什么是“点菜多态”,我如何从中受益?


72

瑞克·希基(Rick Hickey)在他的演讲“简单易用”中谈到“点菜多态”(视频中约30:00)。在同一上下文中,他还提到了Haskell的类型类和Clojure的多方法(和协议)。

由于我对这些概念不是很熟悉,因此我想了解它在尝试实现简单性时的用处。我对Scala中有关此概念的任何示例或展示特别感兴趣。

Answers:


37

您可以按需将“多态”作为“多态”

Clojure社区对术语“多态性”感到骄傲,因为Clojure支持多种多态性策略。他们之中有一些是:

  • 基于原型的多态性

  • 遗传多态性

    这是Java使用的多态策略。Clojure通过代理支持此功能。在进行Java互操作时很有用。

  • 协议

    Clojure的协议与Haskell的TypeClass相同。

  • 多方法

    虽然协议根据第一个参数的类型提供多态调度,但是多方法可以根据方法(任何)参数的任何功能进行调度,因此更加灵活。

单点多态意味着“选择最适合您的情况的多态策略。它们都在您的工具箱中。”

您可以TypeClass使用隐式在Scala中实现模式。如果您需要真实的例子,请阅读Scalaz资料。Scala在语言级别上不支持多种方法,但是我想可以通过即将到来的2.10宏来实现。

至于好处,诸如TypeClass和Multimethod之类的高级多态策略可以帮助解决表达问题

“目标是通过案例定义一种数据类型,在其中可以向该数据类型添加新的案例以及对该数据类型添加新的功能,而无需重新编译现有代码,并保持静态类型安全(例如,不强制转换)”。

顺便说一句,这个问题太大了,无法适合单个StackOverflow问题。我的建议是熟悉这些概念,然后您将了解它们的用处。


1
nitpick非常小,但是如果“协议根据第一个参数的类型提供多态调度”,则它们不对应于Haskell类型类。类型类实例可以在任何东西上“派遣”(您甚至可以让零参数类型函数在类型类的实例中返回一个值,例如read,而预期返回值的类型将确定使用哪个实例)。
2012年

1
read当然有争论。不知道我写那本书时的大脑在哪里。mempty是我在说的一个例子。read但是会根据其预期的返回类型进行分派。

目标是通过案例定义一种数据类型,在该案例中,可以向该数据类型添加新的案例,并在该数据类型上添加新的功能”。...这里的情况是什么意思?
Abdull
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.