Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
scala> val fruits = Seq("apple", "banana", "orange")
fruits: Seq[java.lang.String] = List(apple, banana, orange)
scala> fruits.map(_.toUpperCase)
res0: Seq[java.lang.String] = List(APPLE, BANANA, ORANGE)
scala> fruits.flatMap(_.toUpperCase)
res1: Seq[Char] = List(A, P, P, L, E, B, A, N, A, N, A, O, R, A, N, G, E)
flatMap
— это (=<<)
из Хаскеля, bind
с аргументами в обратном порядке.(=<<) :: Monad m => (a -> m b) -> m a -> m b
-- Same as >>=, but with the arguments interchanged.
> (map toUpper) =<< ["banana","lemon","orange"]
"BANANALEMONORANGE"
List("ab", "cd") >>= {_.toUpperCase.toList}
// List(A, B, C, D)
for {
f <- fruits
//f2 = f.drop(1)
c <- f.toUpperCase
//if c != 'A'
} yield c
1.point[Option]
1.point[List]
import scalaz.contrib.std.utilTry._
1.point[Try]
apply
— это тоже договоренность, которая просто позволяет применять синтаксис вызова функции.List(x)
— это вызов функции apply
на объекте List
.map
address.map(add => println("Address : " + add)).getOrElse(println("Error"))
// Address : my.host.com/82.98.86.171:22
Unit
. Логичнее было бы использовать foreach
, или вынести println
за скобки.println(address.map(add => "Address: " + add).getOrElse("Error"))
Что касается функции unit, то она отвечает за создание монады и для каждой монады она отличается. Для примера, функция unit.
для монады Option это Some(x)
для монады List это List(x)
для монады Try это Success(x)
import scala.util.Try
def f[T]: T => Try[T] = x => throw new Throwable
val num: Int = 5
Try(num) flatMap f
f(num)
Монады в Scala