键入值和"可访问的假型"在Sanctuary.js(梦幻之地)

时间:2017-11-24 12:54:12

标签: javascript haskell functional-programming sanctuary

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

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

  2. Sanctuary documentation讨论了一个"可访问的假型" - 支持属性访问的值的类型,或除nullundefined之外的每个值。它表示" Object接近,但Object.create(null)产生的值支持属性访问但不是Object类型的成员"。但是,打印使用null创建的对象会显示{},其typeofobject似乎就像我对象类型的成员一样。我有什么误会?为什么需要Accessible伪类型?伪类型和常规类型有什么区别?例如,Integer被称为伪类,但它似乎是我Number类的扩展。

1 个答案:

答案 0 :(得分:5)

  

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

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

  

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

是!

  

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

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

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

  

类似接口吗?

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

  

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

“会员”可能在此处引用instanceof - Object.create(null) instanceof Objectfalse,因为它不会从Object.prototype继承。其他可访问但非Object对象可能是来自其他领域的值,如iframe环境。