Монадические сцепления в Scala попробовать

рассмотрим следующую цепочку функции f, g и h использование монадических для-постижений.

  for {
    x <- List ( 11, 22, 33, 44, 55 )
    y <- f ( x )
    z <- g ( y )
    a <- h ( z )
  } yield a

если f, g и h все имеют подпись:

  Int => Option [ Int ] 

тогда для понимания компилирует нормально. Однако, если я заменю Option [ Int ] by Try [ Int ], тип-inferencer Scala жалуется на линию

  y <- f ( x )

со следующим сообщением об ошибке.

  error: type mismatch;
  found   : scala.util.Try[Int]
  required: scala.collection.GenTraversableOnce[?]
      y <- f ( x )

почему? Оба!--12--> и Try [ _ ] являются (или должны быть) монадами и должны работать плавно, как набросано.

1 ответов


вы можете использовать только монады того же рода в A для понимания. В этом случае все ваши значения должны быть GenTraversableOnce, потому что первый. Он работает с Option, потому что существует неявное преобразование из Option to Seq, но это невозможно для Try.