【问题标题】:Type system in ClojureClojure 中的类型系统
【发布时间】:2017-05-08 05:29:28
【问题描述】:

Clojure 中的“抽象编程”原则与鸭子类型相同吗?如果不是,有什么区别?

这是来自http://www.braveclojure.com/core-functions-in-depth/的引用:

原因是 Clojure 定义了 map 和 reduce 函数 序列抽象,而不是特定的数据结构。作为 只要数据结构响应核心序列操作( 函数 first、rest 和 cons,我们将在 时刻),它将与其他序列的map,reduce和oodles一起使用 免费的功能。这就是 Clojurists 编程的意思 抽象,它是 Clojure 哲学的核心原则。

我认为抽象是命名的操作集合。如果你可以的话 对一个对象执行所有抽象操作,然后 object 是抽象的一个实例。我什至认为这样 编程之外。例如,电池抽象包括 操作“将导电介质连接到其阳极和阴极”, 操作的输出是电流。没关系 电池由锂或土豆制成。是电池 只要它响应定义电池的一组操作。

通过行为(“响应”)将数据类型标识为抽象类的一部分。这不就是鸭子打字的精髓吗?感谢您的意见。

【问题讨论】:

    标签: clojure duck-typing


    【解决方案1】:

    通过行为(“响应”)将数据类型标识为抽象类的一部分。

    但他们不是。在 JVM 上,类型只能是接口的一部分,前提是它们明确声明它们实现了接口,然后实现了它的方法。仅仅实现适当命名的方法是不够的,比如 Python,一种典型的鸭子类型语言。

    所写的并不完全是,但它需要一些特定的观点来解释它是正确的:你必须意识到,当作者写作时,

    只要一个数据结构响应核心序列操作...

    这意味着该类型必须实现核心序列接口及其方法。在某种程度上,仅仅公开一个名为first 的函数还不够“响应”同名核心序列操作:该类型还必须实现正确的接口才能“响应”。这是一种在虚拟机中编写东西的奇怪方式,它没有以响应消息为框架,需要一些专业知识和眯眼才能找到正确的含义,但对于不需要了解的初学者来说,这是一个合理的简化。详细信息...除非他们倾向于向 Stack Overflow 询问有关鸭子类型的问题!

    【讨论】:

      【解决方案2】:

      Clojure 中的“编程到抽象”原则是否与 鸭子打字?

      • Clojure 是根据Extensible Abstractions 定义的。
      • 这些是 Java 接口 ...
      • ... 最突出地用于定义核心数据 结构。

      例如序列抽象由clojure.lang.ISeq定义:

      public interface ISeq extends IPersistentCollection {
        Object first();
        ISeq next();
        ISeq more();
        ISeq cons(Object o);
      }
      

      任何实现ISeq 的类都被Clojure 接受为一个序列(行为是否正确是另一回事)。例如,列表和惰性序列就是这样做的,并且被公正地视为序列。将此与经典的 Lisp 进行对比,其中每个函数都应用了一组不同的函数。

      我们有几种不同的向量实现

      • 核心clojure向量类型;
      • rrb 向量;
      • 快速小向量。

      我可以继续。 (其实我做不到。我知道的还不够!)

      【讨论】:

      • 这里的“否”必须是指“是”,因为您的解释继续准确地解释了 Clojure 的“可扩展抽象”是如何成为它的鸭子的。
      • @NeverSleepAgain Alan Malloy's answer 解释了为什么 Clojure 的“可扩展抽象”不是它的鸭子。
      • 他说“仅仅实现适当命名的方法是不够的,例如 Python,一种典型的鸭式打字语言”,他是不正确的,或者我误读了。 Clojure 会拒绝编译不返回正确类型事物的方法,还是在需要 next()-returning-Iseq 时拒绝选择 next()-returning-Frog?因为“仅仅实现适当命名的方法”在公开的鸭式语言中也是不够的,对于“足够”的定义,这意味着程序不仅可以编译而且可以工作。例如,C++ 在同名方法之间进行选择。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-29
      • 2020-06-16
      • 1970-01-01
      • 2012-08-28
      • 2011-01-29
      • 1970-01-01
      相关资源
      最近更新 更多