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
}
→ Ссылка