gpt4 book ai didi

scala - 为什么我必须在此函数中包含额外的类型信息

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

我想在业余时间复习一下 Scala。我的问题是,为什么我必须在这里用多态类型 A 注释“size”。当我计算一棵树的大小时,我对这些信息不感兴趣。尽管如此,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 类;你应该这样写:

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

关于scala - 为什么我必须在此函数中包含额外的类型信息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33198272/

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