gpt4 book ai didi

oop - 在函数式编程中实现多态性

转载 作者:行者123 更新时间:2023-12-03 06:03:16 25 4
gpt4 key购买 nike

我目前正在享受从面向对象语言到函数式语言的转变。这是一股新鲜空气,我发现自己比以前更有效率。

但是,OOP 的一个方面我在 FP 方面还没有看到令人满意的答案,那就是多态性。即我有大量数据项,当它们传递到某些函数时需要以完全不同的方式进行处理。为了便于讨论,我们假设有多种因素驱动多态行为,因此可能会呈指数级增长许多不同的行为组合。

在 OOP 中,可以使用多态性相对较好地处理:通过组合+继承或基于原型(prototype)的方法。

在 FP 中我有点陷入:

  • 编写或编写纯函数,通过对每个数据项的值进行分支来有效地实现多态行为 - 感觉就像组装一个巨大的条件,甚至模拟一个虚拟方法表!
  • 以类似原型(prototype)的方式将函数放入纯数据结构中 - 这似乎可行,但它是否也违反了将纯函数与数据分开定义的想法?

对于这种情况,推荐的功能方法是什么?还有其他好的选择吗?

最佳答案

Putting functions inside pure data structures in a prototype-like fashion - this seems like it works but doesn't it also violate the idea of defining pure functions separately from data?

如果虚拟方法分派(dispatch)是您想要解决问题的方式,那么这是一个完全合理的方法。至于将函数与数据分离,这从一开始就是一个明显的非函数概念。我认为函数式编程的基本原则是函数就是数据。至于你感觉自己正在模拟虚拟功能,我认为这根本不是模拟。它是一个虚函数表,这完全没问题。

仅仅因为该语言没有内置的 OOP 支持并不意味着应用相同的设计原则是不合理的 - 它只是意味着您必须编写更多其他语言提供的内置机制,因为你正在与你所使用的语言的自然精神作斗争。现代类型函数语言确实对多态性有非常深入的支持,但这是一种非常不同的多态性方法。

OOP 中的多态很像逻辑中的“存在量化”——多态值具有某种运行时类型,但你不知道它是什么。在许多函数式编程语言中,多态性更像是“通用量化”——多态值可以实例化为用户想要的任何兼容类型。它们是同一枚硬币的两面(特别是,它们交换位置取决于您是从“内部”还是“外部”查看函数),但事实证明,设计一个函数时非常困难。语言“让硬币公平”,特别是在存在其他语言功能的情况下,例如子类型或多态性(多态性之上的多态性类型)。

如果有帮助的话,您可能希望将函数式语言中的多态性视为非常类似于 C# 或 Java 中的“泛型”,因为这正是 ML 和 Haskell 等所青睐的多态性类型。

关于oop - 在函数式编程中实现多态性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4969593/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com