私は基本的な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] を明示的に指定する必要があるのはなぜですか? サンプル コードではそれらが省略されており、この方法でも機能したに違いないと思います...
- 評価する
c
にc("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")
しますが、このことのデフォルトの実装はありませんか?