首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Clojure的核心是面向对象的吗?(序列中的多态性)

Clojure的核心是面向对象的吗?(序列中的多态性)
EN

Stack Overflow用户
提问于 2009-10-10 15:20:24
回答 3查看 7.1K关注 0票数 31

Clojure是一种函数式lisp,据报道它根本不是面向对象的,尽管它运行在JVM上,JVM是为面向对象语言设计的VM。Clojure通过将列表和向量抽象为一个名为seq的接口,为遍历列表和向量提供了相同的接口。这甚至是使用名为ISeq的Java接口在内部实现的。这不是面向对象抽象的一个例子吗?怎么能说Clojure不是面向对象的呢?

我猜这个问题的推论是-什么时候可以认为多态性与面向对象是不同的?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2009-10-10 16:59:56

惯用的Clojure倾向于定义独立的函数,这些函数在一组非常小的核心数据结构上操作;这种方法和数据的拆分是反对面向对象和支持函数风格的强烈声明。Rich Hickey (Clojure的创建者)反复强调了这一点的重要性;例如:"Clojure eschews the traditional object-oriented approach of creating a new data type for each new situation, instead preferring to build a large library of functions on a small set of types."

在Clojure中,对核心数据结构的依赖甚至比在其他函数式语言中更重要,因为只有在使用Clojure的持久数据结构时,才能从Clojure的STM中获得全部好处。

我猜这个问题的推论-什么时候多态性可以被认为不同于面向对象?

我正在使用Clojure的多方法(即多态工具)来根据文件名的扩展名分派不同的实现-完全不是面向对象的,而是多态的。

票数 31
EN

Stack Overflow用户

发布于 2009-10-10 20:59:15

我猜这个问题的推论-什么时候多态性可以被认为不同于面向对象?

多态性与面向对象完全没有关系。这仅仅意味着相同的操作可以根据其操作数的类型不同而表现不同。

像ML或Haskell这样的函数式语言已经有30多年的多态性了,对PL历史有更好了解的人可能会指出1962年前(即面向对象之前)的一些例子。

Christopher Strachey在1967年描述了参数多态和ad-hoc多态之间的区别,所以多态当时肯定已经存在了。由于多态性只是在Simula-67的OO中引入的,我猜测多态性在引入OO之前就已经存在了。

票数 19
EN

Stack Overflow用户

发布于 2009-10-13 00:27:26

请记住,像ISeq这样的东西是Java语言。

在Clojure中,seq抽象实际上就是你可以提供给first、rest和n个函数的东西(注意,你不是先在seq上调用的,而是先用seq参数调用的)。Clojure语言的核心函数都对集合、seqs或原始类型进行操作。在公开的接口中没有与方法绑定的数据。因此,Clojure的实现是用Java实现的,所有与JVM的互操作都将涉及类/对象,但Clojure语言本身并不涉及。

Clojure不鼓励将方法与数据结构捆绑在一起。

说了这么多...现实情况是,函数在它们将使用的参数方面确实有限制。首先,rest和nth将只在可以是seq的东西上工作。从这个角度来看,无论数据结构是否与方法捆绑在一起,都没有太大区别--您仍然需要正确地匹配它们。最大的胜利来自于灵活性。函数可以编写为接受任何参数,然后与高阶函数组合,而无需定义类等:

代码语言:javascript
运行
复制
(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
票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1548209

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档