Я рассматривал множество примеров трансформаторов монахов Scala и не мог понять, как делать то, что, по моему мнению, может быть чем-то простым. Я хочу написать понимание for
, которое ищет что-то в базе данных (MongoDB), которая возвращает Option
, тогда если Option
является Some
, он просматривает его содержимое и получает еще Option
и так далее. На каждом шаге, если я получаю None
, я хочу прервать все это и создать сообщение об ошибке, например "X not found"
. Понятие for
должно содержать Either
(или что-то подобное), в котором Left
содержит сообщение об ошибке, а Right
содержит успешный результат всей операции (возможно, только строку или объект, построенный с использованием нескольких значений, полученных вдоль путь).Monad transformer в Scala для понимания обрабатывать Опция и собирать сообщения об ошибках
До сих пор я просто использую Option
монады само по себе, так как в этом тривиальном примере:
val docContentOpt = for {
doc <- mongoCollection.findOne(MongoDBObject("_id" -> id))
content <- doc.getAs[String]("content")
} yield content
Однако, я застрял, пытаясь интегрировать что-то вроде Either
в этом. Я ищу фрагмент рабочего кода, а не просто предложение попробовать \/
в Scalaz. Я попытался понять Скалаз, но у него очень мало документации, и мало что существует, кажется, написано для людей, которые знают все об исчислении лямбда, чего у меня нет.
Не знаю, если вы но Scala 2.10 имеет Try the monad для обработки успеха и неудачи: http://www.scala-lang.org/api/current/#scala.util.Try – reggoodwin
Поскольку вы имеете дело с той же монадой (Option) Трансформаторы Monad - это не то, что вы ищете, трансформаторы Monad должны составлять разные типы монад (например, List [Option], Future [Try] и т. Д.) – GClaramunt
@GClaramunt Ah, OK. Я предположил, что мне нужна монада Option, плюс одна монада, отсюда и потребность в монад-трансформаторе. Спасибо, что разъяснил это. –