【问题标题】:Shapeless HList foldLeft with type class requirement in operation无形 HList foldLeft 与操作中的类型类要求
【发布时间】:2018-02-02 20:36:41
【问题描述】:

我试图在折叠函数需要类型类的 HList 上运行 foldLeft。当我引入包含异常的类型类组件时,下面的说明性示例无法运行

trait MyTypeClass[T] {
  def apply(t: T): String
}
object MyTypeClasses {
  implicit val myInt = new MyTypeClass[Int] {
    def apply(t:Int) = s"Int($t)"
  }
  implicit val myString = new MyTypeClass[String] {
    def apply(t:String) = s"String($t)"
  }
  implicit val myBoolean = new MyTypeClass[Boolean] {
    def apply(t:Boolean) = s"Boolean($t)"
  }
}

object FoldPoly extends Poly2 {
  implicit def foldToStringBuffer[U](implicit M:MyTypeClass[U]) =
    at[StringBuffer, (String, U)] { (acc, t) => acc.append(t._1).append(M(t._2)) }
}

object TestRunner {
  def main(args:Array[String]):Unit = {

    val h = ("one" -> 1) :: ("two" -> "2") :: ("three" -> false) :: HNil
    println(h.foldLeft(new StringBuffer())(FoldPoly).toString)

  }
}

失败:

Error:(68, 43) could not find implicit value for parameter folder:
shapeless.ops.hlist.LeftFolder[(String, Int) :: (String, String) :: (String, Boolean) :: shapeless.HNil,StringBuffer,FoldPoly.type]
    println(h.foldLeft(new StringBuffer())(FoldPoly).toString)

我发现自己不知道下一步该做什么......

【问题讨论】:

    标签: scala shapeless


    【解决方案1】:

    您的 typeclass 实例不在隐式范围内。将对象重命名为MyTypeClass,以便将其视为伴侣或导入其内容:

    object TestRunner {
      def main(args:Array[String]):Unit = {
        import MyTypeClasses._
        val h = ("one" -> 1) :: ("two" -> "2") :: ("three" -> false) :: HNil
        println(h.foldLeft(new StringBuffer())(FoldPoly).toString)
    
      }
    }
    

    作品in scastie

    【讨论】:

    • 嗯,这很尴尬......我的实际代码(不是这个例子)在范围内,但它仍然没有运行该错误。但这至少告诉我问题是范围问题,而不是我对 shapeless 的使用
    猜你喜欢
    • 2021-02-18
    • 1970-01-01
    • 2014-06-03
    • 2017-02-10
    • 2020-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多