我正在处理有关Sanctuary.js的文档。我也一直在努力学习Haskell,并且在FP概念上苦苦挣扎。
我理解类型值是一个对象,它具有(a)构造函数(代表类型),(b)类型标识符(类型名称为@@type
的属性, (c)需要由类型实现的任何方法。除了没有任何状态的类型值之外,FP类型值和普通面向对象对象之间有什么区别?Fantasy-Land规范给出了标准类型,包括它们的方法。这些方法中的一些(全部?)遵守代数定律,例如Functors
需要遵循身份和组成规律的map
方法。我是否可以自由创建我的用户类型并要求我喜欢它们的方法吗?那些方法是否必须符合任何代数设计原则或规律?如果没有,它确实看起来像OO设计(减去对象中的状态)给我!我不知道我是什么&#39 ; m缺失。类似接口吗?父对象?
Sanctuary documentation讨论了一个"可访问的假型" - 支持属性访问的值的类型,或除null
和undefined
之外的每个值。它表示" Object
接近,但Object.create(null)
产生的值支持属性访问但不是Object类型的成员"。但是,打印使用null
创建的对象会显示{}
,其typeof
为object
。 似乎就像我对象类型的成员一样。我有什么误会?为什么需要Accessible
伪类型?伪类型和常规类型有什么区别?例如,Integer
被称为伪类,但它似乎是我Number
类的扩展。
答案 0 :(得分:5)
除了没有任何状态的类型值之外,FP类型值和普通面向对象对象之间有什么区别?
不仅它们没有任何可变状态,它们不会像OOP实例那样携带任何值。它们更像是OOP对象的类。它们是仅具有静态方法的JS对象,或者换句话说:包含普通函数的记录。
我是否可以自由创建用户类型并需要我喜欢的方法?
是!
这些方法是否必须符合任何代数设计原则或法律?
没有。是。你可以写非法的方法,没有什么能阻止你。即使在Haskell中,这些法则也不是由编译器/类型检查器强制执行的。 (Usually)。
他们甚至可能会工作。但是他们打破了其他开发人员的假设,他们打破了这些开发人员编写的代码依赖于工作的假设。
类似接口吗?
是的,这可能是一个很好的比喻。或者至少,由类型对象实例化的type classes(JavaScript中必需的具体化)是由类型实现的接口。
打印使用null创建的对象显示
{}
,其typeof
为对象。它对我来说似乎是Object类型的成员。我误解了什么?
“会员”可能在此处引用instanceof
- Object.create(null) instanceof Object
为false
,因为它不会从Object.prototype
继承。其他可访问但非Object
对象可能是来自其他领域的值,如iframe环境。