Спецификация для общих алгебраических типов в JavaScript на основе Fantasy Land.
Fantasy Land использует методы как основу для типов. Экземпляр типа в Fantasy Land
это объект с определенными методами. Например, экземпляр типа Functor должен быть объектом, у которого есть метод map
.
В Static Land тип — просто набор статических функций и экземпляром типа может быть любое значение, в том числе примитивы (Number, Boolean, и т.д.)
Например, мы можем реализовать тип Addition, который используечт числа как экземпляры и удовлетворяет закону моноид:
const Addition = {
empty() {
return 0
},
concat(a, b) {
return a + b
},
}
- Нет конфликтов имен. Поскольку тип — это просто набор функций, которые не имеют общих имен, у нас нет проблем с совпадением имен.
- Мы можем реализовать много типов для того же значения. Например, мы можем реализовать два Monoid'a для чисел: Addition и Multiplication.
- Мы можем рализовать тип со значением в виде примитива (Number, Boolean, и т.д.).
- Мы можем рализовать бесшовный тип. Например, мы можем реализовать тип со значением в виде массива и пользователю не надо будет оборачивать/разворачивать значения в классы обёртки с методавми Fantasy Land.
- Нам прийдётся пробрасывать типы чаще. В Fantasy Land какой-то обычный код может быть написан с использованием только методов, мы должны прокинуть только
of
иempty
. В Static Land мы должны прокидывать типы для любого кода.
Просто раскройте некоторые Типы, которые работают с типами, которые предоставляет ваша библиотека или с типами объявленными в другой библиотеке или с нативными типам, такими как Array.
Тип не должны быть простыми объектами JavaScript; они также могут быть конструкторами при желании. Единственным требованием является:
- этот объект содержит несколько статических методов из Static Land; и
- если он содержит метод с именем как в Static Land, то этот метод должен быть методом Static Land (подчиняясь закону и т.д.).
const SArray = {
of(x) {
return [x]
},
map(fn, arr) {
return arr.map(fn)
},
chain(fn, arr) {
// ...
},
}
export {SArray}
class MyType = {
constructor() {
// ...
}
someInstanceMethod() {
// ...
}
static someNonStaticLandStaticMethod() {
// ...
}
// Static Land methods
static of(x) {
// ...
}
static map(fn, value) {
// ...
}
}
export {MyType}
У нас есть список в вики. Не стесняйтесь добавлять туда свою библиотеку.
У нас также есть пакет static-land
в npm, который предоставляет некоторые полезные утилиты (не много на данный момент).
npm install static-land
// современный JavaScript
import {fromFLType} from 'static-land'
// классический JavaScript
var fromFLType = require('static-land').fromFLType
Или используя CDN:
<script src="https://unpkg.com/static-land/umd/staticLand.js"></script>
<script>
var fromFLType = window.StaticLand.fromFLType
</script>
npm run lobot -- --help
Выполняйте команды lobot так npm run lobot -- args...
.