Для понимания скала

Я склоняюсь к scala, и теперь я хочу понять, как использовать for-compressions для композиции функций. Вот функция, которую я должен реализовать без изменения ее подписи. И я почти закончил, но я не знаю, как справиться с None в этом. Не могли бы вы сказать мне, как изменить это, чтобы получить правильную обработку None? А может я совсем не прав и for-comprehension по-другому используется для составления функций в scala? Спасибо.

 def testForComprehension[A, B, C, D](f: A => Option[B])
                            (g: B => Option[C])
                            (h: C => D): Option[A] => Option[D] = for { first <- _
                                                              second = f(first).get
                                                              third = g(second).get } yield h(third)

person VortxLion    schedule 17.04.2020    source источник
comment
Проблема очень тривиальная, и я чувствую, что предоставление вам ответа помешает вам понять, что происходит, и исправить это на будущее. Взгляните на как работает yield, чтобы понять, как for работает подслащенный, в какой-то момент должно стать очевидным, что вы сделали не так.   -  person Luis Miguel Mejía Suárez    schedule 17.04.2020


Ответы (2)


for {
  a <- _
  b <- f(a)
  c <- g(b)
} yield h(c)

потому что понимание - это просто подслащенная версия ответа jwvh

_.flatMap(f).flatMap(g).map(h)
person Mario Galic    schedule 17.04.2020

Для понимания речь идет о Option, List, Future (все, что имеет такие методы, как map, flatMap и filter), а не о функциях в частности. Не стоит делать .get специально для понимания.

Что вам, вероятно, нужно, это следовать

  def testForComprehension[A, B, C, D](
    f: A => Option[B]
  )(g: B => Option[C])(h: C => D): Option[A] => Option[D] = { v =>
    for {
      first <- v
      second <- f(first)
      third <- g(second)
    } yield h(third)
  }
person Ivan Stanislavciuc    schedule 17.04.2020