为 Free monad 构建一个编译器(Cats 库)



我正试图了解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 使用处理此类型定义的更新编译器。

祝你好运!:)

相关内容

  • 没有找到相关文章

最新更新