gpt4 book ai didi

scala - 值映射不是 Branch[Int] 的成员

转载 作者:行者123 更新时间:2023-12-02 12:37:17 25 4
gpt4 key购买 nike

我有以下 ADT:

import cats.Functor

sealed trait Tree[+A]

final case class Branch[A](left: Tree[A], right: Tree[A]) extends Tree[A]

final case class Leaf[A](value: A) extends Tree[A]

并在仿函数中实现:

implicit def treeFunctor = new Functor[Tree] {
def map[A, B](fa: Tree[A])(f: (A) => B): Tree[B] =
fa match {
case Branch(left, right) => Branch(map(left)(f), map(right)(f))
case Leaf(v) => Leaf(f(v))
}
}

并按如下方式使用它:

val b = Branch(left = Branch(Branch(Leaf(5), Leaf(3)), Leaf(10)), Leaf(45))
val functorTree = Functor[Tree].map(b)((v) => v * 4)

但以下内容:

Branch(Leaf(10), Leaf(20)).map(_ * 2)

我遇到编译器错误:

Error:(21, 29) value map is not a member of A$A90.this.Branch[Int]
Branch(Leaf(10), Leaf(20)).map(_ * 2)
^

我的问题是为什么会收到错误?

最佳答案

方法 treeFunctor 为您提供任何 TreeFunctor[Tree] 实例,但这并不意味着任何 Tree 会自动转换为它。只是对于任何 Tree 来说,作用域中都有一个 Functor[Tree] 的隐式实例。

这个隐式实例有一个方法map,它接受两个参数:要映射的Functor[Tree]实例,以及映射函数本身。

所以这应该有效:

implicitly[Functor[Tree]].map(Branch(Leaf(10), Leaf(20)))(_ * 2)

或者简单地

Functor[Tree].map(Branch(Leaf(10), Leaf(20)))(_ * 2)

(因为 scalaz 和 cats 通常对类型类有这种便利的 apply())

编辑:在阅读您的问题时,我错过了 Functor[Tree].map(b)((v) => v * 4) 部分。所以您真正感兴趣的是以下部分。

如果您想保留调用 map 的语法,您可以创建一个隐式类作为包装器:

implicit class toTreeFunctor[A](tree: Tree[A]) {
def map[B](f: A => B) = Functor[Tree].map(tree)(f)
}

Branch(Leaf(10), Leaf(20)).map(_ * 2)

正如@P所指出的。 Frolov,您可以从 import scalaz.syntax.functor._import cats.syntax.functor._ 免费获得此隐式转换,但请注意,您必须显式地将您的 Branch 向上转型为 Tree 的实例。

关于scala - 值映射不是 Branch[Int] 的成员,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43753202/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com