S
Size: a a a
S
S
S
S
MS
MS
Вл
К
m
m
S.either (S.toUpper) (S.show) (S.Left ('Cannot divide by zero'))
"CANNOT DIVIDE BY ZERO"
S.either (S.toUpper) (S.show) (S.Right (42))
"42”К
Left, которое условно считается ошибкой, но при этом инстансом Error быть не обязано, равно как не обязано реализовывать ни один из интерфейсов. Соответственно, это значение не обязано содержать какой-либо текст. Ты можешь получить это значение с помощью метода fold:const leftOrUndefinedValue = myEither.fold(
left => left,
right => undefined,
)
При таком раскладе у тебя будет либо значение Left, либо undefined. Так же есть метод reduceL:const leftOrUndefinedValue = myEither.reduceL(
(or, left) => left,
undefined, // Можно не передавать
)
Чем бы ты ни пользовался (даже если бы я оставил снаружи свойство left, по которому можно было бы получить ошибку напрямую снаружи) ты можешь вытащить из этой монады значение, которое может быть как ожидаемым тобою значением, так и undefined. Но если тебе на самом деле не нужно ничего никуда вытаскивать, а нужно просто воспользоваться значением (скорей всего, так и есть), то есть методы tap (или tapR) и tapL. В данном случае тебе нужен tapL:myEither.tapL(
left => console.log(left),
)
Если myEither — это Right, то tapL просто не будет ничего делать.m
К
function toEither(value) {
return value instanceof Error ?
Left(value) : Right(value);
}
Результатом выполнения этой функции у тебя будет Either. Left — это Either, и Right — это Either.myEither
.tapR(
right => console.log(`This is Right(${right})`),
)
.tapL(
left => console.log(`This is Left(${left})`),
)К
myEither — это Left, то выполнитсяleft => console.log(`This is Left(${left})`)
Если myEither — это Right, то выполнитсяright => console.log(`This is Right(${right})`)AK
Вл
Вл