1

私は基本的なKleisliの例で遊んでいます

import cats.data.Kleisli
import cats.FlatMap

val parse = Kleisli[Option, String, Int](
  (s: String) => try {
    Some(s.toInt)
  } catch {
    case _: NumberFormatException => None
  }
)

val reciprocal = Kleisli[Option, Int, Double](
  (i: Int) =>
    if (i == 0)
      None
    else
      Some(1.0 / i))

val c = reciprocal.compose(parse)

そして2つのことが私を巻き込みます

  • タイプ [Option,String,Int] を明示的に指定する必要があるのはなぜですか? サンプル コードではそれらが省略されており、この方法でも機能したに違いないと思います...
  • 評価するcc("5")は、本当に手で与える必要がありFlatMap[Option]ますか、それとも暗黙のインポートがありませんか?

追加できます

   implicit val optionFlatmap = new FlatMap[Option] {
      override def flatMap[A, B](fa: Option[A])(f: (A) => Option[B]): Option[B] = fa.flatMap(f)
      override def map[A, B](fa: Option[A])(f: (A) => B): Option[B] = fa.map(f)
    }

を評価c("5")しますが、このことのデフォルトの実装はありませんか?

4

0 に答える 0