Ste*_*eve 26 oop polymorphism jvm sequences clojure
Clojure是一个功能性的lisp,据说它根本不是面向对象的,即使它运行在JVM上,这是一个专为面向对象语言设计的VM.Clojure提供了相同的接口,用于通过将它们抽象到名为seq的接口来迭代列表和向量.甚至可以使用名为ISeq的Java接口在内部实现.这不是面向对象抽象的例子吗?如何声称Clojure不是面向对象的呢?
我想这个问题的必然结果 - 什么时候可以认为多态与面向对象不同?
pmf*_*pmf 27
惯用语Clojure倾向于定义在一小组核心数据结构上运行的独立函数; 这种方法和数据的分拆是对面向对象和支持功能风格的强烈声明.Rich Hickey(Clojure的创造者)一再声明这一点的重要性; 例如:"Clojure避开了为每种新情况创建新数据类型的传统面向对象方法,而是倾向于在一小组类型上构建一个大型函数库." .
在Clojure中对核心数据结构的依赖比在其他函数语言中更为重要,因为当您使用Clojure的持久数据结构时,您只能从Clojure的STM中获得全部好处.
我想这个问题的必然结果 - 什么时候可以认为多态与面向对象不同?
我正在使用Clojure的多方法(即多态设施)根据文件名的扩展名调度到不同的实现 - 不是面向对象,而是多态.
Jör*_*tag 18
我想这个问题的必然结果 - 什么时候可以认为多态与面向对象不同?
多态性与面向对象完全没有关系.它只是意味着相同的操作可以根据其操作数的类型而表现不同.
像ML或Haskell这样的函数式语言已有30多年的多态性,而对PL历史有更好了解的人可能会在1962年之前指出一些例子(即pre-OO).
Christopher Strachey在1967年描述了参数多态性和ad-hoc多态性之间的区别,因此多态性必定已经存在.由于多态性仅在Simula-67中的OO中引入,我的猜测是多态性必须在OO中引入之前就已存在.
请记住,像ISeq这样的东西是Java.
在Clojure中的SEQ抽象是真的只是"东西",你可以提供给第一,休息和第n个功能(注意不先调用一个序列,你首先调用一个序列参数).Clojure语言核心函数全部对集合,seq或原始类型进行操作.在公开的接口中没有与方法捆绑在一起的数据.所以Clojure的实现是用Java编写的,所有与JVM的互操作都将涉及Classes/Objects,但Clojure语言本身却没有.
Clojure不鼓励使用数据结构捆绑方法.
说了这么多......现实是,功能对他们将使用的参数有限制.第一次休息和第n次只会对可以成为seq的东西起作用.从这个角度来看,数据结构是否与方法捆绑在一起没有太大区别 - 您仍然需要正确匹配它们.最大的胜利来自灵活性.可以编写函数来获取任何参数,然后使用更高阶函数编写而不定义类等:
(def farms [{:name "Swansea", :value 100}
{:name "Broadmarsh", :value 200, :produce [:corn :wheat :rye]}
{:name "Snug", :value 50, :animals [:goats :pigs]}])
(reduce + (map :value farms))
-> 350
(reduce + (map :value (filter :animals farms)))
-> 50
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
5889 次 |
| 最近记录: |