Использование конструктора `.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