Использование Либо с синтаксисом for в Scala

Насколько я понимаю, синтаксис 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, как я могу это сделать?

40
задан Dan Burton 2 June 2012 в 23:28
поделиться