【发布时间】:2014-05-12 11:11:47
【问题描述】:
我对来自 OOP 和 C# 背景的函数式编程和 F# 都很陌生,我注意到函数式编程方法通常是静态的,并且根据类型在模块中(我可以理解为什么)。
例如,要使用list,您可以使用List 模块中的函数,使用option 可以使用Option 模块等。
但是,当我接受基类的参数,而派生类有更合适的实现时会发生什么?
在 OOP 中,将调用适当的实现,这是派生的实现,即使对象静态地属于基类,因为该成员已被覆盖。
在函数式编程中会怎样?
如果您将基类型作为参数(应该如此),则您只能使用函数来处理它,就像您只能在 OOP 中调用基的成员一样。
唯一不同的是,在 OOP 中,被调用的成员是合适的。
【问题讨论】:
-
我觉得这可能更适合programmers.stackexchange.com
-
通过根据基类和派生类来构建问题,您已经将面向对象注入其中。因此,任何解决方案要么违反纯函数式编程,要么在上下文中简单地采用标准的面向对象原则。 (注意:OCaml 有像
+和+.这样的运算符来处理整数和浮点数。) -
@Shredderroy 是的,这是真的,我明白你的意思。但是我该如何处理现有的类层次结构?它已经存在于 F# 中,例如集合中。例如,
Seq模块并不总是合适且快速的选择,不是吗? -
你说的模块,完全没有关系。它们只是碰巧有具有相同名称和相似语义的函数。至于现有的类层次结构,您仍然可以在 F# 中继续使用普通的 OOP,如果您愿意的话。然而,我有时会加倍努力,实际上以更代数数据类型的方式重写一些类,并使用对它们进行操作的函数。我发现,添加类的灵活性通常不如添加函数的能力。
-
@DanielFabian 哦,好吧,我明白了。那么如何采用一个采用序列并返回第 1000 个元素的方法呢?我怎么写呢?我可以使用
Seq.nth,这将导致 O(1000),但是我有可以使用 O(1) 和Array.get执行相同操作的数组。如前所述,OOP 做到了这一点,但是功能性呢?问题是它已经存在于 F# 中,所以甚至在我开始之前,我就已经在这个 OOP 领域了。
标签: c# oop f# functional-programming overriding