我正试图了解monads和Cats。在一些例子(例如猫(之后,我编写了如下代码。但是实际上无法弄清楚如何使compiler
做我需要的事情并进行编译。
import cats.Id
import cats.free.Free
import cats.~>
object Filtering extends App {
sealed trait Filter[A]
case class WhitespaceFilter(text: String) extends Filter[Seq[String]]
case class LowerCaseFilter(strings: Seq[String]) extends Filter[Seq[String]]
def whitespaceFilter(text: String): Free[Filter, Seq[String]] = Free.liftF(WhitespaceFilter(text))
def lowerCaseFilter(strings: Seq[String]): Free[Filter, Seq[String]] = Free.liftF(LowerCaseFilter(strings))
val process: (String => Free[Filter, Seq[String]]) = {
text: String =>
for {
p1 <- whitespaceFilter(text)
p2 <- lowerCaseFilter(p1)
} yield p2
}
def compiler: Filter ~> Id =
new (Filter ~> Id) {
def apply[A](fa: Filter[A]): Id[A] =
fa match {
// The code doesn't compile if uncommented...
case WhitespaceFilter(text) => ??? // text.trim.split("""[s]+""")
case LowerCaseFilter(terms) => ??? // terms.map(_.toLowerCase)
}
}
val result: Seq[String] = process("Some Text").foldMap(compiler)
println(result) // should be Seq("some", "text")
}
谢谢!
我在使用您引用的 Cats 示例代码时遇到了类似的问题。 我正在运行 IntelliJ IDEA,IDE 用编译器错误标记注释行,但我实际上可以运行代码并获得输出:
ArrayBuffer(some, text)
我认为IntelliJ的编译器对Id的定义感到困惑:
type Id[A] = A
我不确定IntelliJ是否使用自己的编译器,或者它是否使用Scala编译器。 如果后者为真,则可能有一种方法可以让 IntelliJ 使用处理此类型定义的更新编译器。
祝你好运!:)