Найти тему

Монады Scala в примерах

Окей, в прошлый раз я рассказывал о монадах в целом, но без пояснения, как их применять на практике, понять может быть тяжеловато. Давайте же взглянем на основные монады Scala!

Тип первый - Option. Эта монада чертовски хороша, друг мой, ведь благодаря ей ты можешь перестать бояться NullPointerExeption! Она имеет два состояния - Some(x) и None, либо содержит значение, либо нет. При применении map() или for-comprehension, соответственно, операция будет производиться только с Some(x). Так же, при проверке содержимого мы можем разделять логику с помощью паттерн-матчинга, например:

option match {
case Some(v) => "Здесь мы получили значение v, можем писать дальнейшую логику"
case None => "Здесь отсутствует содержимое, так же можем составить логику при None"
}

Следующий вид - Either. Сигнатура у него - Either[T1, T2] -это означает, что Either может содержать в себе 2 вида данных, один из которых записывается в Right(x), другой - в Left(x). Принято, чтобы значения "положительные", т.е. те значения, которые и должны быть получены, записывались в правую часть, в то время как левая - для значений, где что-то пошло не так. Either для понимания немного сложнее Option'a, но его использование увеличивает возможности вашего кода.

def todo( eiether : Either[Int, Double]) = {
eiether match {
case Right(x) => x //здесь лежит дабл
case Left(x) => x.doubleValue//а здесь - уже инт
}
}

Try - монада для обработки потенциально опасных участков кода, например чтения или записи файла. Оборачивая нужным нам код в Try(), после его завершения, мы можем получить значения типа Success(v) - в случае успеха работы кода, так и Failure(e), где е - это исключение, кинутое в ходе работы. Точно так же, как и прошлые, мы можем обрабатывать их в паттерн-матчинге или мапить.

val a = Try{
throw new RuntimeException//мы не упадём из-за ошибки, а сможем легко её обработать дальше
}
a match {
case Success(v) =>
println(v)
case Failure(e) =>
println(e)//ошибка будет лежать здесь
}

Так же не стоит забывать, что List в scala так же является монадой, собственно так же обладает всеми их качествами, так что не бойтесь ими пользоваться!

Наука
7 млн интересуются