Могу ли я сделать "через" через свойства объекта с 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.