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
Вл
Вл