在 Sanctuary.js 中输入值和 "Accessible Pseudotype"(幻想世界)
Type Values and "Accessible Pseudotype" in Sanctuary.js (Fantasy Land)
我正在阅读 Sanctuary.js 上的文档。我也一直在努力学习 Haskell,并且在 FP 概念上遇到了一些困难。
我理解类型值是一个对象,它具有 (a) 构造函数(类型代表),(b) 类型标识符(类型的名称作为 属性 命名为 @@type
,以及 (c) 该类型需要实现的任何方法。除了没有任何状态的类型值之外,FP 类型值和普通的面向对象对象有什么区别?幻想- Land specification 给出了要实现的标准类型,包括它们的方法。这些方法中的一些(全部?)遵守代数法则,例如 Functors
要求 map
方法遵守身份和组合法则。我有空吗创建我的用户类型并要求他们使用我喜欢的方法?这些方法是否必须符合任何代数设计原则或法则?如果不是,那对我来说肯定像是 OO 设计(减去对象中的状态)!我不不知道我错过了什么。类型像接口吗?父对象?
Sanctuary documentation 谈论 "accessible pseudotype" - 支持 属性 访问的值类型,或除 null
和 undefined
。它说“Object
很接近,但是 Object.create(null)
产生一个支持 属性 访问但不是 Object 类型成员的值”。但是打印一个用 null
创建的对象显示 {}
,它的 typeof
是 object
。在我看来,它似乎 是 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 Object
是 false
,因为它没有继承自 Object.prototype
。其他可访问但非 Object
对象可能是来自其他领域的值,例如 iframe 环境。
我正在阅读 Sanctuary.js 上的文档。我也一直在努力学习 Haskell,并且在 FP 概念上遇到了一些困难。
我理解类型值是一个对象,它具有 (a) 构造函数(类型代表),(b) 类型标识符(类型的名称作为 属性 命名为
@@type
,以及 (c) 该类型需要实现的任何方法。除了没有任何状态的类型值之外,FP 类型值和普通的面向对象对象有什么区别?幻想- Land specification 给出了要实现的标准类型,包括它们的方法。这些方法中的一些(全部?)遵守代数法则,例如Functors
要求map
方法遵守身份和组合法则。我有空吗创建我的用户类型并要求他们使用我喜欢的方法?这些方法是否必须符合任何代数设计原则或法则?如果不是,那对我来说肯定像是 OO 设计(减去对象中的状态)!我不不知道我错过了什么。类型像接口吗?父对象?Sanctuary documentation 谈论 "accessible pseudotype" - 支持 属性 访问的值类型,或除
null
和undefined
。它说“Object
很接近,但是Object.create(null)
产生一个支持 属性 访问但不是 Object 类型成员的值”。但是打印一个用null
创建的对象显示{}
,它的typeof
是object
。在我看来,它似乎 是 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 itstypeof
being object. It seems like a member of the Object type to me. What am I misunderstanding?
"Member" 在这里可能指的是 instanceof
- 而 Object.create(null) instanceof Object
是 false
,因为它没有继承自 Object.prototype
。其他可访问但非 Object
对象可能是来自其他领域的值,例如 iframe 环境。