import cats.{Functor, Monoid}
trait Fold[I, O] {
type M
def m: Monoid[M]
def tally: I => M
def summarize: M => O
}
object Fold {
def apply[I, O, _M](_m: Monoid[_M])(_tally: I => _M, _summarize: _M => O): Fold[I, O] = new Fold[I, O] {
override type M = _M
override def m = _m
override def tally = _tally
override def summarize = _summarize
}
}
object BeautifulFold extends App {
def fold[I, O](input: Seq[I])(f: Fold[I, O]): O =
f.summarize(input.foldLeft(f.m.empty)((x, y) => f.m.combine(x, f.tally(y))))
def sum[M](implicit ev: Monoid[M]): Fold[M, M] = Fold.apply(ev)(identity, identity)
implicit def foldFunctor[I] = new Functor[({type F[X] = Fold[I, X]})#F] {
override def map[A, B](fa: Fold[I, A])(f: A => B): Fold[I, B] =
Fold(fa.m)(fa.tally, fa.summarize.andThen(f))
}
import cats.implicits._
fold(List(1,2,3))(sum)
fold(List(1,2,3))((sum[Int]:Fold[Int,Int]).map(s => s"Sum is $s"))
}在REPL :paste模式下工作得很好,但它抛出了一个错误,
[error] value map is not a member of Fold[Int,Int]
[error] fold(List(1,2,3))((sum[Int]:Fold[Int,Int]).map(s => s"Sum is $s"))在sbt compile期间。SBT版本为1.1.0
build.sbt的部分设置是,
scalaVersion := "2.12.4"
val catsVer = "1.1.0"
scalacOptions ++= Seq("-unchecked", "-deprecation", "-feature", "-Xlog-implicits", "-Ypartial-unification")
libraryDependencies in ThisBuild ++= Seq(
"org.typelevel" %% "cats-core" % catsVer,
"org.typelevel" %% "cats-macros" % catsVer,
"org.typelevel" %% "cats-kernel" % catsVer,
"org.typelevel" %% "cats-free" % catsVer,
...我的编译设置有什么问题?谢谢。
更新1
这段代码没有任何问题。我的错误之处在于,我没有像这里那样在我的实际项目中包含-Ypartial-unification to scalacOptions。还有一件事,请参考答案。
发布于 2018-03-28 14:06:31
如Cats自述文件中所述,在scalacOptions中包含-Ypartial-unification选项是很重要的。如果你有一个多模块的项目,那么它是如何完成的也很重要。应该将该选项添加到需要该选项的模块中。如果希望是全局选项,请将其放在常用设置列表中,如:
lazy val commonSettings = Seq(
organization := "org.teckhooi",
version := "1.0-SNAPSHOT",
publishArtifact in (Compile, packageDoc) := false,
publishArtifact in packageDoc := false,
sources in(Compile, doc) := Seq.empty,
logLevel := util.Level.Info,
scalacOptions ++= Seq("-unchecked", "-deprecation", "-feature", "-Xlog-implicits", "-Ypartial-unification")
)
lazy val root = project aggregate(foo, bar)
lazy val foo = project.settings(commonSettings)
lazy val bar = project.settings(commonSettings))
https://stackoverflow.com/questions/49518606
复制相似问题