我想在业余时间刷新一下Scala。我的问题是,为什么我必须在A
此处用多态类型注释“大小” 。在计算树的大小时,我对这些信息不感兴趣。尽管如此,Scala编译器迫使我这样写:
def size[A](t: Tree[A]): Int = {
t match {
case Leaf => 1
case Branch(l,r) => 1 + size(l) + size(r)
}
}
代替:
def size(t: Tree): Int = {
t match {
case Leaf => 1
case Branch(l,r) => 1 + size(l) + size(r)
}
}
此函数的上下文:
package fpinscala.datastructures
sealed trait Tree[+A]
case class Leaf[A](value: A) extends Tree[A]
case class Branch[A](left: Tree[A], right: Tree[A]) extends Tree[A]
object Tree {
def size[A](t: Tree[A]): Int = {
t match {
case Leaf => 1
case Branch(l,r) => 1 + size(l) + size(r)
}
}
}
首先请注意您的函数有问题:
case Leaf => 1
与Leaf
同伴对象相等而不与案例类匹配;您应该改写:
case Leaf(_) => 1
然后,您可以使用通配符存在性类型来避免使用该类型:
def size(t: Tree[_]): Int = {
t match {
case Leaf(_) => 1
case Branch(l,r) => 1 + size(l) + size(r)
}
}
还要注意,您的size函数还将计算分支的数量,我认为您更可能只想计算叶子。在这种情况下,请将其更改为:
case Branch(l,r) => size(l) + size(r)
计数分支:
size(Branch(Branch(Leaf(1),Leaf(2)),Leaf(3))) = 5
计数叶子:
Branch(Branch(Leaf(1),Leaf(2)),Leaf(3)) = 3
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句