快速提问
使用
trait SubEnv1
trait SubEnv2虽然我理解(我认为)为什么以下代码会起作用:
def logic =
for {
s1 <- Kleisli{(e:SubEnv1) => Option("hello")}
s1 <- Kleisli{(e:Any) => Option("hello2")}
} yield (s1)
//cats.data.Kleisli[Option,SubEnv1,String]我感到困惑的是,为什么以下内容不起作用:
def logic =
for {
s1 <- Kleisli{(e:SubEnv1) => Option("hello")}
s1 <- Kleisli{(e:Nothing) => Option("hello2")}
} yield (s1)
//type mismatch;
//found : Nothing => Option[String]
//required: A => Option[String]其实我不明白这个错误。
flatMap的类型是
def flatMap[C, AA <: A](f: B => Kleisli[F, AA, C])(implicit F: FlatMap[F]): Kleisli[F, AA, C]所以我们有AA <:a
,
Any => Option[C]通过的地方,AA => Option[C]可以通过
考虑到需求
,第二个很奇怪
implicitly[Nothing <:< SubEnv1]
// Nothing <:< SubEnv1 = generalized constraint那么,//required: A => Option[String]需要什么类型而不需要什么呢?
发布于 2020-12-09 19:55:13
我相信你只是在打这个bug:Nothing does not conform to arbitrary type parameter #9453
证明:
Kleisli { (e: SubEnv1) => Option("hello") }.flatMap[String, Nothing] { s1 =>
Kleisli[Option, Nothing, String] { (e: Nothing) => Option("boo") }
}
res34: Kleisli[Option, Nothing, String] = Kleisli(cats.data.Kleisli$$$Lambda$2297/0x0000000800c08840@1385e9e3)(打字正确)
https://stackoverflow.com/questions/65223134
复制相似问题