在 Sanctuary.js 中输入值和 "Accessible Pseudotype"(幻想世界)

Type Values and "Accessible Pseudotype" in Sanctuary.js (Fantasy Land)

我正在阅读 Sanctuary.js 上的文档。我也一直在努力学习 Haskell,并且在 FP 概念上遇到了一些困难。

  1. 我理解类型值是一个对象,它具有 (a) 构造函数(类型代表),(b) 类型标识符(类型的名称作为 属性 命名为 @@type,以及 (c) 该类型需要实现的任何方法。除了没有任何状态的类型值之外,FP 类型值和普通的面向对象对象有什么区别?幻想- Land specification 给出了要实现的标准类型,包括它们的方法。这些方法中的一些(全部?)遵守代数法则,例如 Functors 要求 map 方法遵守身份和组合法则。我有空吗创建我的用户类型并要求他们使用我喜欢的方法?这些方法是否必须符合任何代数设计原则或法则?如果不是,那对我来说肯定像是 OO 设计(减去对象中的状态)!我不不知道我错过了什么。类型像接口吗?父对象?

  2. Sanctuary documentation 谈论 "accessible pseudotype" - 支持 属性 访问的值类型,或除 nullundefined。它说“Object 很接近,但是 Object.create(null) 产生一个支持 属性 访问但不是 Object 类型成员的值”。但是打印一个用 null 创建的对象显示 {},它的 typeofobject。在我看来,它似乎 是 Object 类型的成员。我误会了什么?为什么需要 Accessible 伪类型?伪类型和常规类型有什么区别?例如,Integer 被称为伪class,但对我来说它似乎是 Number class 的扩展。

What is the difference between a FP type value and normal object-oriented objects, besides the type value not having any state?

不仅它们没有任何可变状态,而且它们不像 OOP 实例那样携带 任何 值。它们更像是 OOP 对象的 class。它们是只有 静态方法 的 JS 对象,或者换句话说:包含普通函数的记录。

Am I free to create my user types and require the methods I like on them?

是的!

Do those methods have to conform to any algebraic design principles or laws?

没有。是的。你可以写非法的方法,没有什么能阻止你。即使在 Haskell,compiler/typechecker 也没有执行这些法律。 (Usually).

它们甚至可能有效。但是他们打破了其他开发人员的假设,他们打破了那些开发人员编写的代码依赖于工作的假设。

Are types like interfaces?

是的,这可能是一个很好的比喻。或者至少,由类型对象实例化的 type classes(JavaScript 中必需的具体化)是由该类型实现的接口。

Printing an object created with null shows {}, and its typeof being object. It seems like a member of the Object type to me. What am I misunderstanding?

"Member" 在这里可能指的是 instanceof - 而 Object.create(null) instanceof Objectfalse,因为它没有继承自 Object.prototype。其他可访问但非 Object 对象可能是来自其他领域的值,例如 iframe 环境。