猫leftMap似乎无法正确推断类型

时间:2019-06-14 08:14:45

标签: scala scala-cats

我有一个使用Softwaremill sttp客户端发出HTTP请求的功能。我还将Cats库用于leftMap功能。这是函数:

def tags(repositoryName: String): Either[String, List[Tag]] = {
  val uri = uri"$gitLabBaseUrl/api/v4/projects/$repositoryName/repository/tags"

  val request = sttp.get(uri).header("PRIVATE-TOKEN", privateToken).response(asJson[List[Tag]])

  request
    .send()
    .body
    .flatMap(
      _.leftMap(
        e => Left(e.message)
      )
    )
    .leftMap(_.toString)
}

因此,如您所见,我希望函数的签名为Either [String,List [Tag]]。但是,要实现这一点,我需要执行两个leftMap语句,在我的推理中,仅第一个leftMap应该就足够了。我将语句分解以获得类型签名:

val foo: Id[Response[Either[DeserializationError[circe.Error], List[Tag]]]] = request.send()
val foo2: Either[String, Either[DeserializationError[circe.Error], List[Tag]]] = request.send().body
val foo3: Either[io.Serializable, List[Tag]] = request.send().body.flatMap(_.leftMap(e => Left(e.message)))

并且您可以看到flatMap返回的Either的类型为[io.Serializable,List [Tag]]。但是,request.send()。body的签名是:

Either[String, Either[DeserializationError[circe.Error], List[Tag]]]

因此,e.message导致一个字符串,因此我期望

_.leftMap(e => Left(e.message))

声明已经导致

Either[String, List[Tag]]

但是它具有签名

Either[io.Serializable, List[Tag]]

所以我需要做第二个leftMap以获得正确的签名

Either[String, List[Tag]]

有人可以帮助我如何避免不得不做第二个leftMap吗?似乎没有必要,但我无法弄清楚如何解决它。

谢谢!

1 个答案:

答案 0 :(得分:1)

尝试

request
  .send()
  .body
  .flatMap { _.left.map(_.message) }