Spec-Zone.ru › Sanctuary Type Classes

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.

См. также gt и gte.

> 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.

См. также lt, gt и gte.

> 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.

См. также lt и gte.

> 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.

См. также lt и gt.

> 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.

См. также any и none.

> 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.

См. также all и none.

> 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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API