Scala, cats, http4s - не распознает символ <+> из Http4s - PullRequest
2 голосов
/ 26 апреля 2019

Я создал два Http4s маршрута:

class FirstRoutes[F[_] : Async](service: FirstService[F]) extends Http4sDsl[F] {        
  def routes: HttpRoutes[F] = HttpRoutes.of[F] {
        //... some code
  }
}   

class SecondRoutes[F[_] : Async] extends Http4sDsl[F] {            
    def routes: HttpRoutes[F] = HttpRoutes.of[F] {
    //... some code
    }
}

Теперь в моем методе main я бы хотел назвать эти маршруты следующим образом:

override def run(args: List[String]): IO[ExitCode] =
    for {
      _ <- {
        val app = {
          //...
          val firstRoutes = new FirstRoutes[F](someService)
          val secondRoutes = new SecondRoutes[F]
          (firstRoutes.routes <+> secondRoutes.routes).orNotFound
        }

Но когда я скомпилировал этот код, я получил ошибку:

Error:(26, 33) value <+> is not a member of org.http4s.HttpRoutes[Server.F]
          (firstRoutes.routes <+> secondRoutes.routes).orNotFound

Это странно для меня, потому что я обычно могу использовать этот символ <+>, когда я использую ctrl + пробел в классе маршрута, а также у меня есть хороший импорт:

import cats.effect._
import cats.data._
import org.http4s.server.blaze.BlazeServerBuilder
import cats.effect._
import cats.implicits._

Не удается выяснить, как это исправить, и используйте <+> для вызова классов маршрутов. Может быть, это интеллигентная проблема? Кто-нибудь может мне помочь?

1 Ответ

3 голосов
/ 26 апреля 2019

Может быть, вам следует прочитать http://eed3si9n.com/herding-cats/import-guide.html

https://blog.softwaremill.com/9-tips-about-using-cats-in-scala-you-might-want-to-know-e1bafd365f88 совет 2)

<+> исходит от cats.syntax.semigroupk._.

Следующий код компилируется

import cats.effect.{Async, ExitCode, IO}
import cats.syntax.semigroupk._
import org.http4s.HttpRoutes
import org.http4s.dsl.Http4sDsl
import org.http4s.syntax.kleisli._
import scala.language.higherKinds

class App {

  class FirstRoutes[F[_] : Async](service: FirstService[F]) extends Http4sDsl[F] {
    def routes: HttpRoutes[F] = HttpRoutes.of[F] {
      ???
    }
  }

  class SecondRoutes[F[_] : Async] extends Http4sDsl[F] {
    def routes: HttpRoutes[F] = HttpRoutes.of[F] {
      ???
    }
  }

  trait FirstService[F[_]]

  /*override*/ def run[F[_]: Async](args: List[String]): IO[ExitCode] = {
    val someService: FirstService[F] = ???
    for {
      _ <- {
        val app = {
          //...
          val firstRoutes = new FirstRoutes[F](someService)
          val secondRoutes = new SecondRoutes[F]
          (firstRoutes.routes <+> secondRoutes.routes).orNotFound
        }
        IO(???)
      }
    } yield ExitCode(1)
  }
}
...