Насколько я понимаю, синтаксис for в Scala очень похож на монадический синтаксис do в Haskell. В Scala синтаксис for часто используется для List
и Option
. Я хотел бы использовать его с Либо
s, но необходимые методы отсутствуют в импорте по умолчанию.
for {
foo <- Right(1)
bar <- Left("nope")
} yield (foo + bar)
// expected result: Left("nope")
// instead I get "error: value flatMap is not a member..."
Доступна ли эта функциональность через какой-либо импорт?
Есть небольшая заминка:
for {
foo <- Right(1)
if foo > 3
} yield foo
// expected result: Left(???)
Для списка это будет List()
. Для Option
это будет None
. Предоставляют ли стандартные библиотеки Scala решение этой проблемы? (Или, может быть, scalaz
?) Как? Предположим, я хочу предоставить свой собственный «экземпляр монады» для Both, как я могу это сделать?