Functional programming FP中的类型与OOP中的对象有什么本质区别?

Functional programming FP中的类型与OOP中的对象有什么本质区别?,functional-programming,elixir,Functional Programming,Elixir,原谅我的无知,因为我是新来的。我一直在用长生不老药,所以我给它贴上了标签 当我使用Elixir的iex时,我可以使用I检查变量的类型。e、 g.i“hello”显示我可以在其上使用String模块的函数。我可以做String.downcase“HELLO”,这看起来就像是向一个返回另一个对象的对象发送消息,但表达方式不同,看起来像一个数学函数。ihelper似乎也在检查对象的类,然后帮助我找出该对象中可用的所有方法 我理解不变性是函数式编程的一个关键特性。我也可以用许多OO语言轻松实现不变性,但

原谅我的无知,因为我是新来的。我一直在用长生不老药,所以我给它贴上了标签

当我使用Elixir的iex时,我可以使用
I
检查变量的类型。e、 g.
i“hello”
显示我可以在其上使用
String
模块的函数。我可以做
String.downcase“HELLO”
,这看起来就像是向一个返回另一个对象的对象发送消息,但表达方式不同,看起来像一个数学函数。
i
helper似乎也在检查对象的类,然后帮助我找出该对象中可用的所有方法

我理解不变性是函数式编程的一个关键特性。我也可以用许多OO语言轻松实现不变性,但责任在于程序员


我一直在阅读长生不老药书籍和博客,它们建议我忘记我的OO思维方式,从根本上改变思维方式。我只是不明白它们有什么根本的不同,当唯一的区别是不可变性时,我需要改变思维方式。

我想你的问题可能更确切地说是

“类和代数数据类型之间有什么区别?”

听起来你知道什么是对象和类,所以你可以通过阅读ADT来完成这个谜题:


理解ADT和类之间区别的另一个关键是类处理数据和方法的封装,而ADT通常仅限于数据。但是,请注意,现代趋势是混合使用这两种方法,例如,参见Scala的案例类。

我认为您的问题可能更准确地指定为

“类和代数数据类型之间有什么区别?”

听起来你知道什么是对象和类,所以你可以通过阅读ADT来完成这个谜题:


理解ADT和类之间区别的另一个关键是类处理数据和方法的封装,而ADT通常仅限于数据。但是,请注意,现代趋势是混合使用2,例如Scala的case类。

i helper函数不“检查对象的类”,它基本上是一个在Elixir中的核心术语类型上运行的协议。Elixir中的每个数据值要么是这些类型中的一种,要么是它们的组合

[Atom, Integer, Float, BitString, Regexp, PID, Function, Reference, Port, Tuple, List, Map]
i命令做了一些额外的检查,以区分这些类型的变体,这些变体是标准库的一部分,例如Structs和帮助解决erlang char_列表问题。它够不着 远不止这些;如果将i与复杂组合类型一起使用,则 它知道这是作文的最高层次

如果您只局限于这些基础知识和标准库,那么与OO的区别就不那么明显了。然而,当您开始编写特定于代码的数据结构时,您真正需要将OO思想抛在脑后

[1]无法在Elixir中创建子类或子类型模块。没有猴子修补;无法向字符串添加新函数。虽然您可以使用模块和结构来复制单个对象,并编写乍一看似乎是面向对象的代码,但一旦您跨越了某种复杂程度,这种思维方式就会分崩离析

关于面向对象思想的警告是针对代码的更大体系结构的。当你问这些问题时,长生不老药是最简单的:

我的数据结构是什么

我需要对这些数据结构进行哪些转换

如果你开始用面向对象的方式思考,你会有麻烦的

我的名词是什么

每个名词的动词是什么

虽然这些问题乍一看似乎相似,但有一点不同,即函数不是数据固有的。您可能会将任何模块中的任何函数应用于数据。这种数据和函数的解耦是关键区别


[1] -Elixir非常灵活,如果您足够努力,您可以在其中实现某种OO系统

i helper函数不“检查对象的类”,它基本上是一个协议,在Elixir中对核心术语类型进行操作。Elixir中的每个数据值要么是这些类型中的一种,要么是它们的组合

[Atom, Integer, Float, BitString, Regexp, PID, Function, Reference, Port, Tuple, List, Map]
i命令做了一些额外的检查,以区分这些类型的变体,这些变体是标准库的一部分,例如Structs和帮助解决erlang char_列表问题。它够不着 远不止这些;如果将i与复杂组合类型一起使用,则 它知道这是作文的最高层次

如果您只局限于这些基础知识和标准库,那么与OO的区别就不那么明显了。然而,当您开始编写特定于代码的数据结构时,您真正需要将OO思想抛在脑后

[1]无法在Elixir中创建子类或子类型模块。没有猴子修补;无法向字符串添加新函数。虽然您可以使用模块和结构来复制单个对象,并编写乍一看似乎是面向对象的代码,但一旦您跨越了某种复杂程度,这种思维方式就会分崩离析

关于面向对象思想的警告是针对代码的更大体系结构的。当你问这些问题时,长生不老药是最简单的:

我的数据结构是什么

我需要对这些数据结构进行哪些转换

如果你开始用面向对象的方式思考,你会有麻烦的

我的名词是什么

每个名词的动词是什么

虽然这些问题乍一看似乎相似,但有一点不同,即函数不是数据固有的。您可能会将任何模块中的任何函数应用于数据。这种数据和函数的解耦是关键区别

[1] -Elixir非常灵活,如果您努力的话,可以在其中实现某种OO系统