【问题标题】:What is "polymorphism a la carte" and how can I benefit from it?什么是“多态点菜”,我如何从中受益?
【发布时间】:2012-11-13 05:40:18
【问题描述】:

在他的演讲 Simple Made Easy 中,Rick Hickey 谈到了“Polymorphism a la carte”(视频大约 30:00)。在同一上下文中,他还提到了 Haskell 的 Type Classes 和 Clojure 的 Multi-Methods(和协议)。

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

【问题讨论】:

    标签: scala functional-programming typeclass multimethod


    【解决方案1】:

    您可以将多态点菜视为按需多态

    Clojure 社区为 Polymorphism a la carte 这个术语感到自豪,因为 Clojure 支持多种多态策略。其中一些是:

    • Prototype-based polymorphism

    • 继承多态

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

    • 协议

      Protocol 到 Clojure 就像 TypeClass 到 Haskell。

    • 多方法

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

    Polymorphism a la carte 的意思是“选择最适合您的情况的多态策略。它们都在您的工具箱中。”

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

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

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

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

    【讨论】:

    • 非常小的挑剔,但如果“协议基于第一个参数的类型提供多态调度”,那么它们不对应于 Haskell 类型类。类型类实例可以“分派”任何东西(您甚至可以让零参数类型函数返回类型类实例中的值,如read,并且返回值的类型预期到be 将确定使用哪个实例)。
    • 当然,read 确实需要争论。不知道我写这篇文章时我的大脑在哪里。 mempty 就是我所说的一个例子。不过,read 确实会根据其预期的返回类型进行调度。
    • " [...] 目标是按案例定义数据类型,其中可以向数据类型添加新案例并在数据类型上添加新功能[...]”。 ... case 这里是什么意思?
    猜你喜欢
    • 2012-02-23
    • 1970-01-01
    • 2013-09-05
    • 1970-01-01
    • 1970-01-01
    • 2014-05-27
    • 2010-09-12
    • 2019-02-22
    • 1970-01-01
    相关资源
    最近更新 更多