什么是“单点多态”,我怎样才能从中受益?

时间:2012-11-25 16:43:20

标签: scala functional-programming typeclass multimethod

在他的演讲Simple Made Easy中,Rick Hickey谈到“多面性点菜”(约30:00进入视频)。在同一个背景下,他还提到了Haskell的Type Classes和Clojure的Multi-Methods(以及协议)。

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

1 个答案:

答案 0 :(得分:31)

您可以将多面性点菜作为按需多态性

由于Clojure支持多种多态策略,Clojure社区为单点多态性这一术语感到自豪。其中一些是:

  • Prototype-based polymorphism

  • 继承多态

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

  • 协议

    Clojure的协议是Haskell的TypeClass。

  • 多方法

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

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

您可以使用隐含在Scala中实现TypeClass模式。如果您想要真实世界的示例,请阅读Scalaz source。 Scala不支持语言级别的多方法,但我想在未来的2.10宏的帮助下可以实现。

至于好处,高级多态策略,如TypeClass和Multimethod可以帮助解决Expression Problem

  

“目标是按案例定义数据类型,其中可以在数据类型上添加新案例,在数据类型上添加新函数,而无需重新编译现有代码,同时保留静态类型安全性(例如,无强制转换)”。< / p>

顺便说一下,这个问题太大了,无法适应单个StackOverflow问题。我的建议是熟悉这些概念,然后你就会明白它们的用处。