【发布时间】:2011-06-25 13:42:12
【问题描述】:
我目前正在享受从面向对象语言到函数式语言的转变。这是一股清新的空气,我发现自己比以前更有效率了。
但是 - OOP 的一个方面我还没有在 FP 方面看到令人满意的答案,那就是多态性。即我有大量数据项,当它们被传递到某些函数时,需要以完全不同的方式进行处理。为了争论,假设有多种因素驱动多态行为,因此可能会成倍增加不同的行为组合。
在 OOP 中,使用多态可以相对较好地处理:通过组合+继承或基于原型的方法。
在 FP 中我有点卡在:
- 编写或编写纯函数,通过对每个数据项的值进行分支来有效地实现多态行为——感觉就像组装一个巨大的条件甚至模拟一个虚拟方法表!
- 以类似原型的方式将函数放入纯数据结构中 - 这似乎可行,但它是否也违反了将纯函数与数据分开定义的想法?
对于这种情况,推荐的功能方法是什么?还有其他好的选择吗?
【问题讨论】:
-
我对这个问题很感兴趣,虽然答案都非常有帮助和有趣,但我相信他们可能会遗漏一个重点,即构建异构集合的能力(即迭代什么获得这种多态性的好处)。 IIRC,某些语言(如 Haskell)很难拥有真正的异构集合。那是对的吗?您能否在回答中考虑这一点?
-
好问题!我参加聚会太晚了,但在我看来,您遇到了经典的表达式问题:OOP 允许轻松添加新数据,FP 更容易添加更多功能。我建议阅读this article
-
@Ashley 你可能会发现this answer 很有用。
-
谢谢@dbaltor,两个非常有趣的资源。现在,我知道问题的名称 :-) 顺便说一句,我想我听过(或读过)Martin Odersky 根据第一个参考资料说,当需要轻松添加子类/类型而不重新定义所有功能时,应该使用 OO,和 FP 当您想在不修改类型的情况下轻松添加新功能(或类似的东西,希望我能找到原始来源)。 Rust Traits 可以弥合这种区别?
-
嘿@AshleyAitken,对不起!之前没看到你的评论。不知道奥德斯基的评论,但你是正确的!这就是表达式问题的意义所在。我不知道如何将 FP 和 OO 组合成新的东西来解决这个问题。但是,Traits 的概念似乎完全属于 OO 领域,与 FP 无关。例如,在 Rust 中,Traits 带有自引用。我不是 Haskeller,但他们似乎提出了 Existencial Types 的概念来构建异构集合。
标签: oop language-agnostic prototype functional-programming polymorphism