首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Cats-无标签- Scala宏注释错误

Cats-无标签- Scala宏注释错误
EN

Stack Overflow用户
提问于 2019-04-14 13:25:23
回答 1查看 490关注 0票数 1

我使用trait库创建了一个简单的cats-tagless

代码语言:javascript
复制
@finalAlg
@autoFunctorK(true)
trait MyService[F[_]] {

  def put(element: Element): F[Element]

  def get(elementId: Id): F[Element]

  def all(): F[List[Element]]

  def delete(elementId: Id): F[Unit]
}

但是当我试图编译它时,我得到了一个错误:

代码语言:javascript
复制
Error:(8, 7) macro annotation could not be expanded (the most common reason for that is that you need to enable the macro paradise plugin; another possibility is that you try to use macro annotation in the same compilation run that defines it)

我还将addCompilerPlugin("org.scalamacros" % "paradise" % "2.1.1" cross CrossVersion.full)添加到plugins.sbt文件和build.sbt中,但没有帮助。你能帮我解决吗?

我的build.sbt文件看起来如下:

代码语言:javascript
复制
addCompilerPlugin(("org.scalameta" % "paradise" % "3.0.0-M11").cross(CrossVersion.full))

lazy val commonSettings = Seq(
  libraryDependencies ++= Seq(
    "org.typelevel" %% "cats-core" % CatsVersion,
    "org.typelevel" %% "cats-effect" % "1.2.0",
    "org.typelevel" %% "cats-tagless-macros" % "0.5",
    "org.typelevel" %% "cats-tagless-legacy-macros" % "0.5",
    "org.typelevel" %% "cats-mtl-core" % "0.5.0",
  )
)
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-04-14 14:48:10

在带有此build.sbt的空新项目中

代码语言:javascript
复制
scalaVersion := "2.12.8"

libraryDependencies ++= Seq(
  "org.typelevel" %% "cats-tagless-macros" % "0.5",
  "org.typelevel" %% "cats-tagless-legacy-macros" % "0.5"
)

addCompilerPlugin(
  "org.scalameta" % "paradise" % "3.0.0-M11" cross CrossVersion.full
)

此代码:

代码语言:javascript
复制
import cats.tagless._

case class Element()
case class Id()

@finalAlg
@autoFunctorK(true)
trait MyService[F[_]] {
  def put(element: Element): F[Element]
  def get(elementId: Id): F[Element]
  def all(): F[List[Element]]
  def delete(elementId: Id): F[Unit]
}

就像广告中的这里那样,编译得很好。

如果删除addCompilerPlugin("org.scalameta" % "paradise" % "3.0.0-M11" cross CrossVersion.full),将得到相同的错误消息:

宏注释无法扩展(最常见的原因是需要启用宏天堂插件;另一种可能是在定义宏的编译运行中尝试使用宏注释)

同样,这是记录在案的,链接的页面上写着:

宏注释(@finalAlg、@autoFunctorK、@autoInvariantK等)仍然依赖于scalameta,因此您需要在build.sbt中添加scalameta依赖项。

因此,您似乎需要它,因为@finalAlg@autoFunctorK

请注意,我没有修改project/中的任何内容。

编辑

如果您有多个子项目,则必须将编译器插件添加到实际需要它的子项目中。请注意

代码语言:javascript
复制
addCompilerPlugin(foobar)

本质上是

代码语言:javascript
复制
libraryDependencies += compilerPlugin(foobar)

所以在你的情况下,你应该尝试一下

代码语言:javascript
复制
  libraryDependencies ++= Seq(
    "org.typelevel" %% "cats-core" % "1.6.0",
    "org.typelevel" %% "cats-effect" % "1.2.0",
    "org.typelevel" %% "cats-tagless-macros" % "0.5",
    "org.typelevel" %% "cats-tagless-legacy-macros" % "0.5",
    "org.typelevel" %% "cats-mtl-core" % "0.5.0",
    compilerPlugin(("org.scalameta" % "paradise" % "3.0.0-M11")
      .cross(CrossVersion.full))
  )

然后将其添加到algebra子项目中。

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

https://stackoverflow.com/questions/55675784

复制
相关文章

相似问题

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