Введите значения и "Доступный псевдотип" в Sanctuary.js (Fantasy Land)
Я работаю с документацией на Sanctuary.js. Я также работал над изучением языка Haskell и немного боролся с концепциями FP.
Я понимаю, что значение типа - это объект, который имеет (а) конструктор (представитель типа), (б) идентификатор типа (имя типа как свойство с именем
@@type
и (c) любые методы, которые должны быть реализованы типом. В чем разница между значением типа FP и обычными объектно-ориентированными объектами, кроме значения типа, не имеющего состояния? Спецификация Fantasy-Land дает стандартные типы для реализации, включая методы для них. Некоторые (все?) Из этих методов подчиняются алгебраическим законам, таким какFunctors
требующийmap
метод, который подчиняется законам идентичности и состава. Могу ли я создавать свои типы пользователей и требовать от них тех методов, которые мне нравятся? Должны ли эти методы соответствовать каким-либо алгебраическим принципам или законам проектирования? Если нет, то мне кажется, что дизайн ОО (без состояния объекта) мне кажется! Я не знаю, что мне не хватает. Типы похожи на интерфейсы? Родительские объекты?В документации Sanctuary говорится о "доступном псевдотипе" - типе значений, которые поддерживают доступ к свойству, или каждом значении, кроме
null
а такжеundefined
, Это говорит о том, что "Object
близко, ноObject.create(null)
создает значение, которое поддерживает доступ к свойству, но не является членом типа "Объект". Но печать объекта, созданного сnull
шоу{}
, И егоtypeof
являющийсяobject
, Это похоже на член типа Object для меня. Что я недопонимаю? ПочемуAccessible
нужен псевдо-тип? И в чем разница между псевдотипом и обычным типом?Integer
например, называется псевдоклассом, но кажется, что это расширениеNumber
класс для меня.
1 ответ
В чем разница между значением типа FP и обычными объектно-ориентированными объектами, кроме значения типа, не имеющего состояния?
Дело не только в том, что они не имеют изменяемого состояния, они не несут никаких значений, как это делают экземпляры ООП. Они больше похожи на класс объекта ООП. Это объекты JS, имеющие только статические методы или иначе: запись, содержащая простые функции.
Могу ли я создавать свои типы пользователей и требовать от них тех методов, которые мне нравятся?
Да!
Должны ли эти методы соответствовать каким-либо алгебраическим принципам или законам проектирования?
Нет да. Вы можете написать незаконные методы, и ничто не остановит вас. Даже в Haskell эти законы не применяются компилятором / проверкой типов. ( Обычно).
Они могут даже работать. Но они нарушают предположения других разработчиков, и они нарушают предположения, на которые опирается код, написанный этими разработчиками.
Типы похожи на интерфейсы?
Да, это может быть хорошей метафорой. Или, по крайней мере, классы типов, экземпляры которых создаются объектами типов (необходимость в JavaScript), являются интерфейсами, которые реализуются типом.
Печать объекта, созданного с нулевыми шоу
{}
, И егоtypeof
быть объектом. Это похоже на член типа Object для меня. Что я недопонимаю?
"Член", вероятно, относится к instanceof
здесь - и Object.create(null) instanceof Object
является false
потому что он не наследуется от Object.prototype
, Другие доступные, но неObject
объекты могут быть значениями из других областей, например, среды iframe.