Объедините несколько объектов с Sanctuary.js - PullRequest
0 голосов
/ 03 апреля 2019

Я пытаюсь объединить несколько объектов с Sanctuary.

С Ramda.js я бы сделал что-то вроде этого (см. REPL здесь ):

const R = require('ramda');
const initialEntry = { a: 0, b: 1 };
const entries = [{c: 2}, {d: 3, e: 4}, {f: 5, g: 6, h: 7}];
R.reduce(Object.assign, initialEntry, entries);

Однако в случае с Santuary.js следующая строка кода вызывает исключение.

S.reduce(Object.assign)(initialEntry)(entries)

Вот исключение, которое я получаю:

! Invalid value

reduce :: Foldable f => (a -> b -> a) -> a -> f b -> a
                              ^^^^^^
                                1

1)  {"a": 0, "b": 1} :: Object, StrMap Number, StrMap FiniteNumber, StrMap Integer, StrMap NonNegativeInteger, StrMap ValidNumber

The value at position 1 is not a member of ‘b -> a’.

Я озадачен этим сообщением об ошибке.Я неправильно использую S.reduce?Кроме того, я не получаю ошибок, если я пишу S.reduce(Object.assign)(initialEntry)([]).

Ответы [ 2 ]

3 голосов
/ 03 апреля 2019

Это потому, что первый аргумент reduce принимает функцию с подписью a -> b -> a.В отличие от Рамды, Святилище строго относится к таким подписям.Вы должны предоставить ему функцию, которая принимает аргумент одного типа и возвращает функцию, которая принимает аргумент второго типа и возвращает аргумент первого типа.Object assign не делает этого.Это занимает переменное количество объектов за один раз.

Вы можете это исправить, заменив Object.assign на a => b => Object.assign(a, b):

const initialEntry = { a: 0, b: 1 };
const entries = [{c: 2}, {d: 3, e: 4}, {f: 5, g: 6, h: 7}];

const res = S.reduce(a => b => Object.assign(a, b)) (initialEntry) (entries);

console.log(res);
<script src="https://bundle.run/sanctuary@1.0.0"></script>
<script>const S = sanctuary</script>

Версия Ramda работает, потому что ожидает двоичную функцию reduce.Хотя Object.assign технически вариативен, все работает нормально, если вы рассматриваете его как двоичную функцию.

1 голос
/ 03 апреля 2019

<a href="https://sanctuary.js.org/#concat" rel="nofollow noreferrer">S.concat</a> может быть специализировано до <a href="https://github.com/sanctuary-js/sanctuary-def#StrMap" rel="nofollow noreferrer">StrMap</a> a -> <a href="https://github.com/sanctuary-js/sanctuary-def#StrMap" rel="nofollow noreferrer">StrMap</a> a -> <a href="https://github.com/sanctuary-js/sanctuary-def#StrMap" rel="nofollow noreferrer">StrMap</a> a.В результате тип <a href="https://sanctuary.js.org/#reduce" rel="nofollow noreferrer">S.reduce</a> (<a href="https://sanctuary.js.org/#concat" rel="nofollow noreferrer">S.concat</a>) ({}) равен <a href="https://github.com/sanctuary-js/sanctuary-type-classes#Foldable" rel="nofollow noreferrer">Foldable</a> f => f (<a href="https://github.com/sanctuary-js/sanctuary-def#StrMap" rel="nofollow noreferrer">StrMap</a> a) -> <a href="https://github.com/sanctuary-js/sanctuary-def#StrMap" rel="nofollow noreferrer">StrMap</a> a.Это может быть специализировано для <a href="https://github.com/sanctuary-js/sanctuary-def#Array" rel="nofollow noreferrer">Array</a> (<a href="https://github.com/sanctuary-js/sanctuary-def#StrMap" rel="nofollow noreferrer">StrMap</a> a) -> <a href="https://github.com/sanctuary-js/sanctuary-def#StrMap" rel="nofollow noreferrer">StrMap</a> a.Например:

> S.reduce (S.concat) ({}) ([{a: 0, b: 1}, {c: 2}, {d: 3, e: 4}, {f: 5, g: 6, h: 7}])
{a: 0, b: 1, c: 2, d: 3, e: 4, f: 5, g: 6, h: 7}

Sanctuary не предоставляет функцию для объединения произвольных объектов.

...