-1

我正在阅读有关 Sanctuary.js 的文档。我也一直在努力学习 Haskell,并且在 FP 概念上有些挣扎。

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

  2. Sanctuary 文档讨论了“可访问的伪类型”——支持属性访问的值的类型,或除andnull之外的所有值undefined。它说“Object很接近,但Object.create(null)会产生一个支持属性访问但不是 Object 类型成员的值”。但是打印一个用null显示创建的对象{},以及它的typeof存在object。对我来说,它似乎是 Object 类型的成员。我有什么误解?为什么Accessible需要伪类型?伪类型和常规类型有什么区别?Integer,例如,被称为伪类,但Number对我来说似乎是类的扩展。

4

1 回答 1

5

除了类型值没有任何状态之外,FP 类型值和普通的面向对象对象有什么区别?

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

我可以自由地创建我的用户类型并要求他们使用我喜欢的方法吗?

是的!

这些方法是否必须符合任何代数设计原则或法则?

不,是的。你可以编写非法的方法,没有什么能阻止你。即使在 Haskell 中,编译器/类型检查器也不会强制执行这些法律。(通常)。

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

类型像接口吗?

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

打印使用 null 显示创建的对象{},并且它typeof是对象。对我来说,它似乎是 Object 类型的成员。我有什么误解?

“成员”在这里可能指的是instanceof- 并且Object.create(null) instanceof Objectfalse,因为它不继承自Object.prototype. 其他可访问但非Object对象可能是来自其他领域的值,例如 iframe 环境。

于 2017-11-24T13:32:14.860 回答