【问题标题】:Scala, cats, http4s - does not recognize <+> symbol from Http4sScala、cats、http4s - 无法识别来自 Http4s 的 <+> 符号
【发布时间】:2019-04-25 21:07:50
【问题描述】:

我创建了两条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+space 时,我通常可以使用这个 &lt;+&gt; 符号,而且我有很好的导入:

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

找不到解决此问题的方法并使用&lt;+&gt; 调用路由类。也许是intellij问题?有人可以帮我吗?

【问题讨论】:

    标签: scala scala-cats http4s


    【解决方案1】:

    为 build.sbt 添加这个 scala 选项

    scalacOptions += "-Ypartial-unification"
    

    【讨论】:

      【解决方案2】:

      也许你应该阅读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)

      &lt;+&gt; 来自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)
        }
      }
      

      【讨论】:

      • 嗯,奇怪。我将您的导入复制到我的项目中,但没有帮助。我还建立了整个项目。也许是intellij缓存的问题。我会检查的。
      • @allocer 试试sbt clean compile。检查您是否没有两次导入相同的隐式(通过不同的导入)。
      • 没有任何帮助。由于给定的错误,Sbt clean 编译没有完成。我也清理了intellij缓存,没有任何改变。有没有其他别名可以把&lt;+&gt;改成调用方法?
      • @allocer firstRoutes.routes &lt;+&gt; secondRoutes.routesSemigroupK[Kleisli[OptionT[F, ?], Request[F], ?]].combineK(firstRoutes.routes, secondRoutes.routes) 的语法。
      • @allocer 也可以将firstRoutes.routes &lt;+&gt; secondRoutes.routes写成firstRoutes.routes.&lt;+&gt;(secondRoutes.routes)firstRoutes.routes.$less$plus$greater(secondRoutes.routes)
      猜你喜欢
      • 2021-04-24
      • 2021-12-25
      • 1970-01-01
      • 2018-03-02
      • 1970-01-01
      • 2021-01-10
      • 2020-05-03
      • 1970-01-01
      • 2020-11-13
      相关资源
      最近更新 更多