Использование конструктора `.of` в Sanctuary Maybe

Я работаю над учебником по функциональному программированию, который показывает следующий пример кода с использованием библиотеки sanctuary.js:

var S = require('sanctuary')
var Maybe = S.Maybe

S.add(
  Maybe.of(3)
  ,Maybe.of(5)
)
.map(n => n * n)

Я получаю ошибку Maybe.of is not a function, Документация API sanctuary.js показывает пример использования .of как S.of(S.Maybe, 42)поэтому я изменил свой код следующим образом:

...
S.of(S.Maybe, 3)
,S.of(S.Maybe, 5)

И я получаю ошибку:

add :: FiniteNumber -> FiniteNumber -> FiniteNumber
       ^^^^^^^^^^^^
            1

The value at position 1 is not a member of ‘FiniteNumber’.

Я не вижу никакой документации на сайте святилища о классе типа FiniteNumber. Как мне заставить этот код работать? И есть ли способ связать святилище .of конструктор на классы типов, так что пример на сайте учебного пособия работает?

2 ответа

Решение

Вы не можете добавить два Maybes, вы можете добавить только два числа. Обратите внимание, что учебник, который вы читаете, использует add = R.lift(R.add),

В святилище вы можете использовать

S.lift2(S.add, S.Just(3), S.Just(5)) // Just(8)

или же

S.ap(S.map(S.add, S.Just(3)), S.Just(5)) // Just(8)
S.Just(3).map(S.add).ap(S.Just(5)) // Just(8)

или же

S.ap(S.ap(S.Just(S.add), S.Just(3)), S.Just(5)) // Just(8)
S.Just(S.add).ap(S.Just(3)).ap(S.Just(5)) // Just(8)

Для переноса некоторого значения в Maybe Вы должны использовать функцию S.toMaybe вместо Maybe.of

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