Функциональное программирование преобразует массив монад в массив монады - PullRequest
0 голосов
/ 02 ноября 2019

У меня есть массив таких монад

[Left("a"), Left("b"), Left("c")]

Я хочу преобразовать его в эту форму

Left(["a", "b", "c"])

Как я могу это сделать?

Есть ликонкретный оператор для выполнения чего-то подобного или я должен написать это сам?

1 Ответ

3 голосов
/ 02 ноября 2019

Как отмечается в комментариях, это будет необычная функция для типа Either.Left. sequence Рамды будет работать с Either.Right:

console .log (
  sequence (of, [Right('a'), Right ('b'), Right ('c')] ) //~> Right (['a', 'b', 'c'])
)
<script src="//bundle.run/ramda@0.26.1"></script>
<script src="//bundle.run/ramda-fantasy@0.8.0"></script>
<script>const {sequence} = ramda, {Either: {Left, Right, of}} = ramdaFantasy</script>

Но это потому, что Right означает успешную обработку с результирующим значением, а Left означает сбой, который остановит дальнейшую обработку. Это очень похоже на Maybe, за исключением того, что оно фиксирует первоначальную ошибку, которая остановила обработку.

Существуют другие типы, которые фиксируют множественные ошибки. Например, типы Validation из Folktale или Monet фиксируют несколько ошибок, но обычно они заключаются в один экземпляр Failure, а не в их массив.

Очевидно, что вы можете написать свою собственную функцию для этого, но вряд ли она будет соответствовать четко определенным законам.

...