Composing functions in scala
I learn scala in university and I cannot understand how to use map, flatmap and Option. Here's couple functions from my lab. I know how to implement first but I have no idea how to deal with second? So, the question: how to implement second function without changing it's signature (using map and flatmap)?
def testCompose[A, B, C, D](f: A => B)
(g: B => C)
(h: C => D): A => D = h compose g compose f
def testMapFlatMap[A, B, C, D](f: A => Option[B])
(g: B => Option[C])
(h: C => D): Option[A] => Option[D] = // help
Ответы (1 шт):
Автор решения: Андрей Елисеев
→ Ссылка
Результат функции testMapFlatMap - это функция Option[A] => Option[D]. Поэтому можно написать:
def testMapFlatMap[A, B, C, D](f: A => Option[B])
(g: B => Option[C])
(h: C => D): Option[A] => Option[D] = { a =>
// остальной код
}
В этой функции входной параметр - Option. Для типа Option в стандартной библиотеке scala определены функции flatMap и map.
Сигнатура flatMap для Option:
def flatMap[B](f: A => Option[B]): Option[B]
Сигнатура map для Option:
def map[B](f: A => B): Option[B]
Используя всё вышесказанное, можно реализовать функцию testMapFlatMap:
def testMapFlatMap[A, B, C, D](f: A => Option[B])
(g: B => Option[C])
(h: C => D): Option[A] => Option[D] = { a =>
a flatMap f flatMap g map h
}