sanctuary-type-classes
Спецификация Fantasy Land «определяет взаимозаменяемость общих алгебраических структур» путём определения ряда типов классов. Для каждого типа класса она указывает законы, которым каждый член типа должен подчиняться, чтобы тип был членом типа класса. Например, для того, чтобы тип Maybe считался Functor, каждый Maybe a значение должен иметь метод fantasy-land/map, который подчиняется законам тождества и композиции.
Этот проект предоставляет:
-
TypeClass, функцию для определения типов классов; - одно
TypeClassзначение для каждого типа класса Fantasy Land; - законные методы Fantasy Land для встроенных типов JavaScript;
- одну функцию для каждого метода Fantasy Land; и
- несколько функций, полученных из этих функций.
Иерархия типов классов
Setoid Semigroupoid Semigroup Foldable Functor Contravariant Filterable
(equals) (compose) (concat) (reduce) (map) (contramap) (filter)
| | | \ / | | | | \
| | | \ / | | | | \
| | | \ / | | | | \
| | | \ / | | | | \
| | | \ / | | | | \
Ord Category Monoid Traversable | | | | \
(lte) (id) (empty) (traverse) / | | \ \
| / | | \ \
| / / \ \ \
| Profunctor / \ Bifunctor \
| (promap) / \ (bimap) \
| / \ \
Group / \ \
(invert) Alt Apply Extend
(alt) (ap) (extend)
/ / \ \
/ / \ \
/ / \ \
/ / \ \
/ / \ \
Plus Applicative Chain Comonad
(zero) (of) (chain) (extract)
\ / \ / \
\ / \ / \
\ / \ / \
\ / \ / \
\ / \ / \
Alternative Monad ChainRec
(chainRec)
API
TypeClass :: (String, String, Array TypeClass, a -> Boolean) -> TypeClass
Аргументы:
- имя типа класса, префикс которого соответствует имени npm-пакета;
- URL документации типа класса;
- массив зависимостей; и
- предикат, принимающий любое значение JavaScript и возвращающий
trueесли значение удовлетворяет требованиям типа класса;falseв противном случае.
Пример:
// hasMethod :: String -> a -> Boolean
const hasMethod = name => x => x != null && typeof x[name] == 'function';
// Foo :: TypeClass
const Foo = Z.TypeClass (
'my-package/Foo',
'http://example.com/my-package#Foo',
[],
hasMethod ('foo')
);
// Bar :: TypeClass
const Bar = Z.TypeClass (
'my-package/Bar',
'http://example.com/my-package#Bar',
[Foo],
hasMethod ('bar')
); Типы, значения которых имеют метод foo, являются членами типа класса Foo. Члены типа класса Foo, значения которых имеют метод bar, также являются членами типа класса Bar.
У каждого TypeClass значения есть поле test: функция, принимающая любое значение JavaScript и возвращающая true если значение удовлетворяет предикату типа класса и предикатам всех зависимостей типа класса; false в противном случае.
TypeClass значения могут использоваться с sanctuary-def для определения параметрически полиморфных функций, которые проверяют свои ограничения типа во время выполнения.
Setoid :: TypeClass
TypeClass значение для Setoid.
> Z.Setoid.test (null) true > Z.Setoid.test (Useless) false > Z.Setoid.test ([1, 2, 3]) true > Z.Setoid.test ([Useless]) false
Ord :: TypeClass
TypeClass значение для Ord.
> Z.Ord.test (0) true > Z.Ord.test (Math.sqrt) false > Z.Ord.test ([1, 2, 3]) true > Z.Ord.test ([Math.sqrt]) false
Semigroupoid :: TypeClass
TypeClass значение для Semigroupoid.
> Z.Semigroupoid.test (Math.sqrt) true > Z.Semigroupoid.test (0) false
Category :: TypeClass
TypeClass значение для Category.
> Z.Category.test (Math.sqrt) true > Z.Category.test (0) false
Semigroup :: TypeClass
TypeClass значение для Semigroup.
> Z.Semigroup.test ('')
true
> Z.Semigroup.test (0)
false
Monoid :: TypeClass
TypeClass значение для Monoid.
> Z.Monoid.test ('')
true
> Z.Monoid.test (0)
false
Group :: TypeClass
TypeClass значение для Group.
> Z.Group.test (Sum (0))
true
> Z.Group.test ('')
false
Filterable :: TypeClass
TypeClass значение для Filterable.
> Z.Filterable.test ({})
true
> Z.Filterable.test ('')
false
Functor :: TypeClass
TypeClass значение для Functor.
> Z.Functor.test ([])
true
> Z.Functor.test ('')
false
Bifunctor :: TypeClass
TypeClass значение для Bifunctor.
> Z.Bifunctor.test (Pair ('foo') (64))
true
> Z.Bifunctor.test ([])
false
Profunctor :: TypeClass
TypeClass значение для Profunctor.
> Z.Profunctor.test (Math.sqrt) true > Z.Profunctor.test ([]) false
Apply :: TypeClass
TypeClass значение для Apply.
> Z.Apply.test ([])
true
> Z.Apply.test ('')
false
Applicative :: TypeClass
TypeClass значение для Applicative.
> Z.Applicative.test ([])
true
> Z.Applicative.test ({})
false
Chain :: TypeClass
TypeClass значение для Chain.
> Z.Chain.test ([])
true
> Z.Chain.test ({})
false
ChainRec :: TypeClass
TypeClass значение для ChainRec.
> Z.ChainRec.test ([])
true
> Z.ChainRec.test ({})
false
Monad :: TypeClass
TypeClass значение для Monad.
> Z.Monad.test ([])
true
> Z.Monad.test ({})
false
Alt :: TypeClass
TypeClass значение для Alt.
> Z.Alt.test ({})
true
> Z.Alt.test ('')
false
Plus :: TypeClass
TypeClass значение для Plus.
> Z.Plus.test ({})
true
> Z.Plus.test ('')
false
Alternative :: TypeClass
TypeClass значение для Alternative.
> Z.Alternative.test ([])
true
> Z.Alternative.test ({})
false
Foldable :: TypeClass
TypeClass значение для Foldable.
> Z.Foldable.test ({})
true
> Z.Foldable.test ('')
false
Traversable :: TypeClass
TypeClass значение для Traversable.
> Z.Traversable.test ([])
true
> Z.Traversable.test ('')
false
Extend :: TypeClass
TypeClass значение для Extend.
> Z.Extend.test ([])
true
> Z.Extend.test ({})
false
Comonad :: TypeClass
TypeClass значение для Comonad.
> Z.Comonad.test (Identity (0)) true > Z.Comonad.test ([]) false
Contravariant :: TypeClass
TypeClass значение для Contravariant.
> Z.Contravariant.test (Math.sqrt) true > Z.Contravariant.test ([]) false
equals :: (a, b) -> Boolean
Возвращает true если его аргументы равны; false в противном случае.
Конкретно:
-
Аргументы с разными идентификаторами типов не равны.
-
Если у первого аргумента есть метод
fantasy-land/equals, этот метод вызывается для определения равенства аргументов (fantasy-land/equalsреализации предоставляются для следующих встроенных типов: Null, Undefined, Boolean, Number, Date, RegExp, String, Array, Arguments, Error, Object и Function). -
В противном случае аргументы равны, если их элементы равны (согласно этому алгоритму).
Алгоритм поддерживает циклические структуры данных. Два массива равны, если у них одинаковые индексные пути и для каждого пути равны значения. Два массива, которые представляют [1, [1, [1, [1, [1, ...]]]]], например, равны, даже если их внутренние структуры отличаются. Два объекта равны, если у них одинаковые пути свойств и для каждого пути равны значения.
> Z.equals (0, -0) true > Z.equals (NaN, NaN) true > Z.equals (Cons (1, Cons (2, Nil)), Cons (1, Cons (2, Nil))) true > Z.equals (Cons (1, Cons (2, Nil)), Cons (2, Cons (1, Nil))) false
lt :: (a, b) -> Boolean
Возвращает true , если его аргументы одного типа и первый меньше второго в соответствии с методом fantasy-land/lte типа; false в противном случае.
Эта функция получена из lte.
> Z.lt (0, 0) false > Z.lt (0, 1) true > Z.lt (1, 0) false
lte :: (a, b) -> Boolean
Возвращает true , если его аргументы одного типа и первый меньше или равен второму в соответствии с методом fantasy-land/lte типа; false в противном случае.
fantasy-land/lte реализации предоставляются для следующих встроенных типов: Null, Undefined, Boolean, Number, Date, String, Array, Arguments и Object.
Алгоритм поддерживает циклические структуры данных так же, как и equals.
> Z.lte (0, 0) true > Z.lte (0, 1) true > Z.lte (1, 0) false
gt :: (a, b) -> Boolean
Возвращает true , если его аргументы одного типа и первый больше второго в соответствии с методом fantasy-land/lte типа; false в противном случае.
Эта функция получена из lte.
> Z.gt (0, 0) false > Z.gt (0, 1) false > Z.gt (1, 0) true
gte :: (a, b) -> Boolean
Возвращает true , если его аргументы одного типа и первый больше или равен второму в соответствии с методом fantasy-land/lte типа; false в противном случае.
Эта функция получена из lte.
> Z.gte (0, 0) true > Z.gte (0, 1) false > Z.gte (1, 0) true
min :: Ord a => (a, a) -> a
Возвращает меньший из двух аргументов.
Эта функция получена из lte.
См. также max.
> Z.min (10, 2)
2
> Z.min (new Date ('1999-12-31'), new Date ('2000-01-01'))
new Date ('1999-12-31')
> Z.min ('10', '2')
'10'
max :: Ord a => (a, a) -> a
Возвращает больший из двух аргументов.
Эта функция получена из lte.
См. также min.
> Z.max (10, 2)
10
> Z.max (new Date ('1999-12-31'), new Date ('2000-01-01'))
new Date ('2000-01-01')
> Z.max ('10', '2')
'2'
clamp :: Ord a => (a, a, a) -> a
Принимает нижнюю границу, верхнюю границу и значение того же типа. Возвращает значение, если оно находится в пределах границ; ближайшую границу в противном случае.
Эта функция получена из min и max.
> Z.clamp (0, 100, 42)
42
> Z.clamp (0, 100, -1)
0
> Z.clamp ('A', 'Z', '~')
'Z'
compose :: Semigroupoid c => (c j k, c i j) -> c i k
Обертка функции для fantasy-land/compose.
fantasy-land/compose реализации предоставляются для следующих встроенных типов: Function.
> Z.compose (Math.sqrt, x => x + 1) (99) 10
id :: Category c => TypeRep c -> c
Обертка функции для fantasy-land/id.
fantasy-land/id реализации предоставляются для следующих встроенных типов: Function.
> Z.id (Function) ('foo')
'foo'
concat :: Semigroup a => (a, a) -> a
Обертка функции для fantasy-land/concat.
fantasy-land/concat реализации предоставляются для следующих встроенных типов: String, Array и Object.
> Z.concat ('abc', 'def')
'abcdef'
> Z.concat ([1, 2, 3], [4, 5, 6])
[1, 2, 3, 4, 5, 6]
> Z.concat ({x: 1, y: 2}, {y: 3, z: 4})
{x: 1, y: 3, z: 4}
> Z.concat (Cons ('foo', Cons ('bar', Cons ('baz', Nil))), Cons ('quux', Nil))
Cons ('foo', Cons ('bar', Cons ('baz', Cons ('quux', Nil))))
empty :: Monoid m => TypeRep m -> m
Обертка функции для fantasy-land/empty.
fantasy-land/empty реализации предоставляются для следующих встроенных типов: String, Array и Object.
> Z.empty (String)
''
> Z.empty (Array)
[]
> Z.empty (Object)
{}
> Z.empty (List)
Nil
invert :: Group g => g -> g
Обертка функции для fantasy-land/invert.
> Z.invert (Sum (5)) Sum (-5)
filter :: Filterable f => (a -> Boolean, f a) -> f a
Обертка функции для fantasy-land/filter. Отбрасывает каждый элемент, который не удовлетворяет предикату.
fantasy-land/filter реализации предоставляются для следующих встроенных типов: Array и Object.
См. также reject.
> Z.filter (x => x % 2 == 1, [1, 2, 3])
[1, 3]
> Z.filter (x => x % 2 == 1, {x: 1, y: 2, z: 3})
{x: 1, z: 3}
> Z.filter (x => x % 2 == 1, Cons (1, Cons (2, Cons (3, Nil))))
Cons (1, Cons (3, Nil))
> Z.filter (x => x % 2 == 1, Nothing)
Nothing
> Z.filter (x => x % 2 == 1, Just (0))
Nothing
> Z.filter (x => x % 2 == 1, Just (1))
Just (1)
reject :: Filterable f => (a -> Boolean, f a) -> f a
Отбрасывает каждый элемент, который удовлетворяет предикату.
Эта функция получена из filter.
> Z.reject (x => x % 2 == 1, [1, 2, 3])
[2]
> Z.reject (x => x % 2 == 1, {x: 1, y: 2, z: 3})
{y: 2}
> Z.reject (x => x % 2 == 1, Cons (1, Cons (2, Cons (3, Nil))))
Cons (2, Nil)
> Z.reject (x => x % 2 == 1, Nothing)
Nothing
> Z.reject (x => x % 2 == 1, Just (0))
Just (0)
> Z.reject (x => x % 2 == 1, Just (1))
Nothing
map :: Functor f => (a -> b, f a) -> f b
Обертка функции для fantasy-land/map.
fantasy-land/map реализации предоставляются для следующих встроенных типов: Array, Object и Function.
> Z.map (Math.sqrt, [1, 4, 9])
[1, 2, 3]
> Z.map (Math.sqrt, {x: 1, y: 4, z: 9})
{x: 1, y: 2, z: 3}
> Z.map (Math.sqrt, s => s.length) ('Sanctuary')
3
> Z.map (Math.sqrt, Pair ('foo') (64))
Pair ('foo') (8)
> Z.map (Math.sqrt, Nil)
Nil
> Z.map (Math.sqrt, Cons (1, Cons (4, Cons (9, Nil))))
Cons (1, Cons (2, Cons (3, Nil)))
flip :: Functor f => (f (a -> b), a) -> f b
Применяет каждую из заданных функций к заданному значению.
Эта функция получена из map.
> Z.flip (x => y => x + y, '!') ('foo')
'foo!'
> Z.flip ([Math.floor, Math.ceil], 1.5)
[1, 2]
> Z.flip ({floor: Math.floor, ceil: Math.ceil}, 1.5)
{floor: 1, ceil: 2}
> Z.flip (Cons (Math.floor, Cons (Math.ceil, Nil)), 1.5)
Cons (1, Cons (2, Nil))
bimap :: Bifunctor f => (a -> b, c -> d, f a c) -> f b d
Обертка функции для fantasy-land/bimap.
> Z.bimap (s => s.toUpperCase (), Math.sqrt, Pair ('foo') (64))
Pair ('FOO') (8)
mapLeft :: Bifunctor f => (a -> b, f a c) -> f b c
Применяет заданную функцию к левой стороне Бифунктора.
> Z.mapLeft (Math.sqrt, Pair (64) (9)) Pair (8) (9)
promap :: Profunctor p => (a -> b, c -> d, p b c) -> p a d
Обертка функции для fantasy-land/promap.
fantasy-land/promap реализации предоставляются для следующих встроенных типов: Function.
> Z.promap (Math.abs, x => x + 1, Math.sqrt) (-100) 11
ap :: Apply f => (f (a -> b), f a) -> f b
Обертка функции для fantasy-land/ap.
fantasy-land/ap реализации предоставляются для следующих встроенных типов: Array, Object и Function.
> Z.ap ([Math.sqrt, x => x * x], [1, 4, 9, 16, 25])
[1, 2, 3, 4, 5, 1, 16, 81, 256, 625]
> Z.ap ({a: Math.sqrt, b: x => x * x}, {a: 16, b: 10, c: 1})
{a: 4, b: 100}
> Z.ap (s => n => s.slice (0, n), s => Math.ceil (s.length / 2)) ('Haskell')
'Hask'
> Z.ap (Identity (Math.sqrt), Identity (64))
Identity (8)
> Z.ap (Cons (Math.sqrt, Cons (x => x * x, Nil)), Cons (16, Cons (100, Nil)))
Cons (4, Cons (10, Cons (256, Cons (10000, Nil))))
lift2 :: Apply f => (a -> b -> c, f a, f b) -> f c
Применяет a -> b -> c к Apply f => f a -> f b -> f c и возвращает результат.
Эта функция получена из map и ap.
См. также lift3.
> Z.lift2 (x => y => Math.pow (x, y), [10], [1, 2, 3]) [10, 100, 1000] > Z.lift2 (x => y => Math.pow (x, y), Identity (10), Identity (3)) Identity (1000)
lift3 :: Apply f => (a -> b -> c -> d, f a, f b, f c) -> f d
Поднимает a -> b -> c -> d до Apply f => f a -> f b -> f c -> f d и возвращает результат применения этого к заданным аргументам.
Эта функция получена из map и ap.
См. также lift2.
> Z.lift3 (x => y => z => x + z + y,
. ['<', '['],
. ['>', ']'],
. ['foo', 'bar', 'baz'])
[ '<foo>', '<bar>', '<baz>',
. '<foo]', '<bar]', '<baz]',
. '[foo>', '[bar>', '[baz>',
. '[foo]', '[bar]', '[baz]' ]
> Z.lift3 (x => y => z => x + z + y,
. Identity ('<'),
. Identity ('>'),
. Identity ('baz'))
Identity ('<baz>')
apFirst :: Apply f => (f a, f b) -> f a
Комбинирует два эффектных действия, сохраняя только результат первого. Эквивалентно функции (<*) в Haskell.
Эта функция получена из lift2.
См. также apSecond.
> Z.apFirst ([1, 2], [3, 4]) [1, 1, 2, 2] > Z.apFirst (Identity (1), Identity (2)) Identity (1)
apSecond :: Apply f => (f a, f b) -> f b
Комбинирует два эффектных действия, сохраняя только результат второго. Эквивалентно функции (*>) в Haskell.
Эта функция получена из lift2.
См. также apFirst.
> Z.apSecond ([1, 2], [3, 4]) [3, 4, 3, 4] > Z.apSecond (Identity (1), Identity (2)) Identity (2)
of :: Applicative f => (TypeRep f, a) -> f a
Обертка функции для fantasy-land/of.
Реализации fantasy-land/of предоставляются для следующих встроенных типов: Array и Function.
> Z.of (Array, 42) [42] > Z.of (Function, 42) (null) 42 > Z.of (List, 42) Cons (42, Nil)
append :: (Applicative f, Semigroup (f a)) => (a, f a) -> f a
Возвращает результат добавления первого аргумента ко второму.
Эта функция получена из concat и of.
См. также prepend.
> Z.append (3, [1, 2]) [1, 2, 3] > Z.append (3, Cons (1, Cons (2, Nil))) Cons (1, Cons (2, Cons (3, Nil)))
prepend :: (Applicative f, Semigroup (f a)) => (a, f a) -> f a
Возвращает результат добавления первого аргумента в начало второго.
Эта функция получена из concat и of.
См. также append.
> Z.prepend (1, [2, 3]) [1, 2, 3] > Z.prepend (1, Cons (2, Cons (3, Nil))) Cons (1, Cons (2, Cons (3, Nil)))
chain :: Chain m => (a -> m b, m a) -> m b
Обертка функции для fantasy-land/chain.
Реализации fantasy-land/chain предоставляются для следующих встроенных типов: Array и Function.
> Z.chain (x => [x, x], [1, 2, 3])
[1, 1, 2, 2, 3, 3]
> Z.chain (x => x % 2 == 1 ? Z.of (List, x) : Nil,
. Cons (1, Cons (2, Cons (3, Nil))))
Cons (1, Cons (3, Nil))
> Z.chain (n => s => s.slice (0, n),
. s => Math.ceil (s.length / 2))
. ('Haskell')
'Hask'
join :: Chain m => m (m a) -> m a
Удаляет один уровень вложенности из вложенной монадической структуры.
Эта функция получена из chain.
> Z.join ([[1], [2], [3]]) [1, 2, 3] > Z.join ([[[1, 2, 3]]]) [[1, 2, 3]] > Z.join (Identity (Identity (1))) Identity (1)
chainRec :: ChainRec m => (TypeRep m, (a -> c, b -> c, a) -> m c, a) -> m b
Обертка функции для fantasy-land/chainRec.
Реализации fantasy-land/chainRec предоставляются для следующих встроенных типов: Array.
> Z.chainRec ( . Array, . (next, done, s) => s.length == 2 ? [s + '!', s + '?'].map (done) . : [s + 'o', s + 'n'].map (next), . '' . ) ['oo!', 'oo?', 'on!', 'on?', 'no!', 'no?', 'nn!', 'nn?']
alt :: Alt f => (f a, f a) -> f a
Обертка функции для fantasy-land/alt.
Реализации fantasy-land/alt предоставляются для следующих встроенных типов: Array и Object.
> Z.alt ([1, 2, 3], [4, 5, 6]) [1, 2, 3, 4, 5, 6] > Z.alt (Nothing, Nothing) Nothing > Z.alt (Nothing, Just (1)) Just (1) > Z.alt (Just (2), Just (3)) Just (2)
zero :: Plus f => TypeRep f -> f a
Обертка функции для fantasy-land/zero.
Реализации fantasy-land/zero предоставляются для следующих встроенных типов: Array и Object.
> Z.zero (Array)
[]
> Z.zero (Object)
{}
> Z.zero (Maybe)
Nothing
reduce :: Foldable f => ((b, a) -> b, b, f a) -> b
Обертка функции для fantasy-land/reduce.
Реализации fantasy-land/reduce предоставляются для следующих встроенных типов: Array и Object.
> Z.reduce ((xs, x) => [x].concat (xs), [], [1, 2, 3])
[3, 2, 1]
> Z.reduce (Z.concat, '', Cons ('foo', Cons ('bar', Cons ('baz', Nil))))
'foobarbaz'
> Z.reduce (Z.concat, '', {foo: 'x', bar: 'y', baz: 'z'})
'yzx'
size :: Foldable f => f a -> Integer
Возвращает количество элементов заданной структуры.
Эта функция получена из reduce.
> Z.size ([])
0
> Z.size (['foo', 'bar', 'baz'])
3
> Z.size (Nil)
0
> Z.size (Cons ('foo', Cons ('bar', Cons ('baz', Nil))))
3
all :: Foldable f => (a -> Boolean, f a) -> Boolean
Возвращает true если все элементы структуры удовлетворяют предикату; false в противном случае.
Эта функция получена из reduce.
> Z.all (Number.isInteger, []) true > Z.all (Number.isInteger, [1, 2, 3]) true > Z.all (Number.isInteger, [0, 0.25, 0.5, 0.75, 1]) false
any :: Foldable f => (a -> Boolean, f a) -> Boolean
Возвращает true если любой элемент структуры удовлетворяет предикату; false в противном случае.
Эта функция получена из reduce.
> Z.any (Number.isInteger, []) false > Z.any (Number.isInteger, [1, 2, 3]) true > Z.any (Number.isInteger, [0, 0.25, 0.5, 0.75, 1]) true
none :: Foldable f => (a -> Boolean, f a) -> Boolean
Возвращает true если ни один из элементов структуры не удовлетворяет предикату; false в противном случае.
Эта функция получена из any. Z.none (pred, foldable) эквивалентно !(Z.any (pred, foldable)).
См. также all.
> Z.none (Number.isInteger, []) true > Z.none (Number.isInteger, [0, 0.25, 0.5, 0.75, 1]) false
elem :: (Setoid a, Foldable f) => (a, f a) -> Boolean
Принимает значение и структуру и возвращает true если значение является элементом структуры; false в противном случае.
Эта функция получена из equals и reduce.
> Z.elem ('c', ['a', 'b', 'c'])
true
> Z.elem ('x', ['a', 'b', 'c'])
false
> Z.elem (3, {x: 1, y: 2, z: 3})
true
> Z.elem (8, {x: 1, y: 2, z: 3})
false
> Z.elem (0, Just (0))
true
> Z.elem (0, Just (1))
false
> Z.elem (0, Nothing)
false
intercalate :: (Monoid m, Foldable f) => (m, f m) -> m
Конкатенирует элементы заданной структуры, разделяя каждую пару смежных элементов заданным разделителем.
Эта функция получена из concat, empty и reduce.
> Z.intercalate (', ', [])
''
> Z.intercalate (', ', ['foo', 'bar', 'baz'])
'foo, bar, baz'
> Z.intercalate (', ', Nil)
''
> Z.intercalate (', ', Cons ('foo', Cons ('bar', Cons ('baz', Nil))))
'foo, bar, baz'
> Z.intercalate ([0, 0, 0], [])
[]
> Z.intercalate ([0, 0, 0], [[1], [2, 3], [4, 5, 6], [7, 8], [9]])
[1, 0, 0, 0, 2, 3, 0, 0, 0, 4, 5, 6, 0, 0, 0, 7, 8, 0, 0, 0, 9]
foldMap :: (Monoid m, Foldable f) => (TypeRep m, a -> m, f a) -> m
Разобщает складной, отображая каждый элемент в моноид и конкатенируя результаты.
Эта функция получена из concat, empty и reduce.
> Z.foldMap (String, f => f.name, [Math.sin, Math.cos, Math.tan]) 'sincostan'
reverse :: (Applicative f, Foldable f, Monoid (f a)) => f a -> f a
Инвертирует элементы заданной структуры.
Эта функция получена из concat, empty, of и reduce.
> Z.reverse ([1, 2, 3]) [3, 2, 1] > Z.reverse (Cons (1, Cons (2, Cons (3, Nil)))) Cons (3, Cons (2, Cons (1, Nil)))
sort :: (Ord a, Applicative f, Foldable f, Monoid (f a)) => f a -> f a
Выполняет стабильную сортировку элементов заданной структуры, используя lte для сравнения.
Эта функция получена из lte, concat, empty, of и reduce.
См. также sortBy.
> Z.sort (['foo', 'bar', 'baz'])
['bar', 'baz', 'foo']
> Z.sort ([Just (2), Nothing, Just (1)])
[Nothing, Just (1), Just (2)]
> Z.sort (Cons ('foo', Cons ('bar', Cons ('baz', Nil))))
Cons ('bar', Cons ('baz', Cons ('foo', Nil)))
sortBy :: (Ord b, Applicative f, Foldable f, Monoid (f a)) => (a -> b, f a) -> f a
Выполняет стабильную сортировку элементов заданной структуры, используя lte для сравнения значений, полученных путем применения заданной функции к каждому элементу структуры.
Эта функция получена из lte, concat, empty, of и reduce.
См. также sort.
> Z.sortBy (s => s.length, ['red', 'green', 'blue'])
['red', 'blue', 'green']
> Z.sortBy (s => s.length, ['black', 'white'])
['black', 'white']
> Z.sortBy (s => s.length, ['white', 'black'])
['white', 'black']
> Z.sortBy (s => s.length, Cons ('red', Cons ('green', Cons ('blue', Nil))))
Cons ('red', Cons ('blue', Cons ('green', Nil)))
traverse :: (Applicative f, Traversable t) => (TypeRep f, a -> f b, t a) -> f (t b)
Обертка функции для fantasy-land/traverse.
Реализации fantasy-land/traverse предоставляются для следующих встроенных типов: Array и Object.
См. также sequence.
> Z.traverse (Array, x => x, [[1, 2, 3], [4, 5]]) [[1, 4], [1, 5], [2, 4], [2, 5], [3, 4], [3, 5]] > Z.traverse (Identity, x => Identity (x + 1), [1, 2, 3]) Identity ([2, 3, 4])
sequence :: (Applicative f, Traversable t) => (TypeRep f, t (f a)) -> f (t a)
Инвертирует заданный t (f a) для получения f (t a).
Эта функция получена из traverse.
> Z.sequence (Array, Identity ([1, 2, 3])) [Identity (1), Identity (2), Identity (3)] > Z.sequence (Identity, [Identity (1), Identity (2), Identity (3)]) Identity ([1, 2, 3])
extend :: Extend w => (w a -> b, w a) -> w b
Оборачивающая функция для fantasy-land/extend.
Реализации fantasy-land/extend предоставляются для следующих встроенных типов: Array и Function.
> Z.extend (ss => ss.join (''), ['x', 'y', 'z'])
['xyz', 'yz', 'z']
> Z.extend (f => f ([3, 4]), Z.reverse) ([1, 2])
[4, 3, 2, 1]
duplicate :: Extend w => w a -> w (w a)
Добавляет один уровень вложенности в комонадическую структуру.
Эта функция получена из extend.
> Z.duplicate (Identity (1)) Identity (Identity (1)) > Z.duplicate ([1]) [[1]] > Z.duplicate ([1, 2, 3]) [[1, 2, 3], [2, 3], [3]] > Z.duplicate (Z.reverse) ([1, 2]) ([3, 4]) [4, 3, 2, 1]
extract :: Comonad w => w a -> a
Оборачивающая функция для fantasy-land/extract.
> Z.extract (Identity (42)) 42
contramap :: Contravariant f => (b -> a, f a) -> f b
Оборачивающая функция для fantasy-land/contramap.
Реализации fantasy-land/contramap предоставляются для следующих встроенных типов: Function.
> Z.contramap (s => s.length, Math.sqrt) ('Sanctuary')
3
© 2020 Sanctuary
© 2016 Plaid Technologies, Inc.
Licensed under the MIT License.
https://github.com/sanctuary-js/sanctuary-type-classes/blob/v13.0.0/README.md