Кошки leftMap, кажется, не могут правильно определить тип - PullRequest
2 голосов
/ 14 июня 2019

У меня есть функция, которая делает HTTP-запрос с помощью клиента Softwaremill STTP.Я также использую библиотеку 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)))

И, как вы можете видеть, Either, возвращаемый flatMap, имеет тип [io.Serializable, List [Tag]].Однако подпись для request.send (). Body:

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

, поэтому e.message приводит к String, и поэтому я ожидал, что оператор

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

уже приводит к

Either[String, List[Tag]]

Но вместо этого он имеет в качестве подписи

Either[io.Serializable, List[Tag]]

Так что мне нужно сделать второй leftMap, чтобы получить правильную подпись

Either[String, List[Tag]]

Может кто-нибудь помочь мне, как мне избежать необходимости делать вторую левую карту?Кажется, что в этом нет необходимости, но я не смог понять, как ее решить.

Спасибо!

1 Ответ

1 голос
/ 14 июня 2019

Попробуйте

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