首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >scala与猫的Kleisli推理

scala与猫的Kleisli推理
EN

Stack Overflow用户
提问于 2020-12-09 18:54:19
回答 1查看 41关注 0票数 2

快速提问

使用

代码语言:javascript
复制
trait SubEnv1
trait SubEnv2

虽然我理解(我认为)为什么以下代码会起作用:

代码语言:javascript
复制
    def logic  =
        for {
            s1  <- Kleisli{(e:SubEnv1) => Option("hello")}
            s1  <- Kleisli{(e:Any) => Option("hello2")}
        } yield (s1)
//cats.data.Kleisli[Option,SubEnv1,String]

我感到困惑的是,为什么以下内容不起作用:

代码语言:javascript
复制
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的类型是

代码语言:javascript
复制
def flatMap[C, AA <: A](f: B => Kleisli[F, AA, C])(implicit F: FlatMap[F]): Kleisli[F, AA, C]

所以我们有AA <:a

  1. ,我认为第一件工作是因为逆反关系。在期望Any => Option[C]

通过的地方,AA => Option[C]可以通过

考虑到需求

,第二个很奇怪

代码语言:javascript
复制
implicitly[Nothing <:< SubEnv1]
// Nothing <:< SubEnv1 = generalized constraint

那么,//required: A => Option[String]需要什么类型而不需要什么呢?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-12-09 19:55:13

我相信你只是在打这个bug:Nothing does not conform to arbitrary type parameter #9453

证明:

代码语言:javascript
复制
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)

(打字正确)

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65223134

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档