У меня есть функция, которая возвращает экземпляр Either, где левая сторона представляет исключение / ошибку, а вторая сторона хранит возвращаемое значение.
Если экземпляр Either был создан для ветви Error, я хочу немедленно вернуться. Если экземпляр был создан Right, я хочу обернуть его в Maybe и продолжить (поскольку он входит в функцию как Maybe и просматривается только в том случае, если это Nothing).
Это работает в моих тестовых примерах:
- isN ничего не передается в :: lookup является ошибкой
- isN ничего не передается в :: поиск успешен
- isJust (22) передается (поиск не выполняется)
Код выглядит нормально, но я не думаю, что мне может не хватать тонкостей данных Folktale в любой из библиотек.
// from data.monad
const someValue = Maybe.Nothing()
// ...snip...
if (someValue.isNothing) {
// from data.either :: Either.Left | Either.Right
const possiblySomeValue = yield lookupSomeValue()
if(possiblySomeValue.isLeft) {
return possiblySomeValue
} else {
someValue = Maybe.Just(possiblySomeValue.get())
}
}
Я комбинирую ES6 (узел 4.1) с Folktale: data.either и data.maybe. Моя цель действительно улучшить мое понимание того, как правильно писать в этом стиле.
обновить проблема немного сложнее, я вернулся к резервным копиям независимых поисков, которые, как мне кажется, могут быть связаны вместе:
// from data.monad
const someValue = Maybe.Nothing()
// ...snip...
if (someValue.isNothing) {
// from data.either :: Either.Left | Either.Right
const possiblySomeValue = yield lookupSomeValue()
if(possiblySomeValue.isLeft) {
return possiblySomeValue
} else {
someValue = Maybe.Just(possiblySomeValue.get())
}
}
// from data.monad
const someValue2 = Maybe.Nothing()
// ...snip...
if (someValue2.isNothing) {
// from data.either :: Either.Left | Either.Right
const possiblySomeValue2 = yield lookupSomeValue2()
if(possiblySomeValue2.isLeft) {
return possiblySomeValue2
} else {
someValue2 = Maybe.Just(possiblySomeValue2.get())
}
}
Это сплошные события, которые делают код супер уродливым ...