在Sanctuary.js(Fantasy Land)中键入值和"可访问的假型"

cal*_*-io -1 javascript haskell functional-programming sanctuary

我正在处理Sanctuary.js上的文档.我一直在努力学习Haskell,并且在FP概念上有点挣扎.

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

  2. 保护区的文档支持属性访问值的类型,或只是每个值-关于"通达假"的谈判nullundefined.它表示" Object接近,但Object.create(null)产生一个支持属性访问的值,但它不是Object类型的成员".但是,打印具有创建的对象null显示{},它的typeof存在object.它对我来说似乎是Object类型的成员.我有什么误会?为什么Accessiblepsuedo类型是必要的?伪类型和常规类型有什么区别?Integer例如,被称为伪类,但它似乎是Number我的类的扩展.

Ber*_*rgi 5

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

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

我可以自由创建我的用户类型并需要我喜欢的方法吗?

是!

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

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

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

类似接口吗?

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

打印使用null显示创建的对象{}及其typeof作为对象.它对我来说似乎是Object类型的成员.我有什么误会?

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