Могу ли я сделать "через" через свойства объекта с Sanctuary

Ramda была моей первой библиотекой функционального программирования, и теперь я сравниваю Sanctuary с Ramda. Может быть, некоторые мои вопросы слишком глупы, но я не нашел лучшего способа узнать Святилище.

Мой вопрос следующий: как я могу map массив во вложенном свойстве Object?

Рамда код для этого:

const addOneForNumbers = R.over(R.lensProp('numbers'), R.map(R.add(1)))

addOneForNumbers({ numbers: [1, 2, 3, 4, 5] })
// {"numbers": [2, 3, 4, 5, 6]}

Есть ли у Убежища плата за выполнение задания?

1 ответ

Решение

В этом случае существует решение только для святилища, но в общем случае понадобятся линзы.

Эта конкретная проблема может быть решена следующим образом:

> S.map(S.map(S.add(1)), {numbers: [1, 2, 3, 4, 5]})
{numbers: [2, 3, 4, 5, 6]}

Это зависит от {numbers: [1, 2, 3, 4, 5]} быть членом StrMap (Array Number), Поскольку строковые карты являются функторами, мы можем отобразить карту строк для доступа к массиву, а затем отобразить массив для доступа к числам.

Если бы объект имел другие поля разных типов, он не был бы строковой картой. Тип {active: true, numbers: [1, 2, 3, 4, 5]} является { active :: Boolean, numbers :: Array Number }тип записи. Типы записей не поддерживают отображение, поэтому нам потребуется что-то вроде R.over а также R.lensProp применить преобразование к значению numbers поле. Sanctuary пока не предоставляет никаких функций для работы с линзами. Если вы заинтересованы в добавлении этих функций в библиотеку, подумайте над комментарием к https://github.com/sanctuary-js/sanctuary/issues/177.

Другие вопросы по тегам