Для понимания scala - PullRequest
       36

Для понимания scala

0 голосов
/ 17 апреля 2020

Я склоняюсь scala и теперь я хочу понять, как использовать for-comprensions для композиции функций. Вот функция, которую я должен реализовать, не меняя свою подпись. И я почти закончил, но я не знаю, как с этим справиться. Не могли бы вы сказать мне, пожалуйста, как изменить это, чтобы получить надлежащую обработку None? Или, может быть, я совершенно не прав, и для понимания используются другие способы составления функций в 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)

Ответы [ 2 ]

1 голос
/ 17 апреля 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)
  }
0 голосов
/ 17 апреля 2020
for {
  a <- _
  b <- f(a)
  c <- g(b)
} yield h(c)

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

_.flatMap(f).flatMap(g).map(h)
...