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

米歇尔·博肯特(Michiel Borkent)

我想在业余时间刷新一下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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

为什么必须在function()中包含对函数的调用

为什么我必须在fold中写下匿名函数的返回类型

为什么我必须在此列上使用聚合函数?

为什么我必须在此代码中添加一个新变量

因为什么时候必须在Java中包含一个空的构造函数?

为什么我必须在这里指定类型?

JavaScript:为什么我必须在表中单击两次以执行colorActiveLine函数?

JS 承诺:为什么 await 必须在异步函数中?

在Swift函数中,当函数在循环中包含带if语句的for循环时,为什么“ return”必须在for循环之外?

为什么我必须在onLoaderReset中交换swapCursor(null)?

为什么现在必须在Swift中覆盖我的init?

为什么必须在此代码中强制转换为 struct in_addr ?

我必须在此iptables设置中添加些什么,以允许mysql通过ssh访问?

为什么我必须在C ++中的std :: array <SomeStruct,size>初始化时为每个项目指定类型

错误:我使用Swift 4请求中的额外参数。为什么我必须传递[String:Any]类型的参数?

为什么我必须在React中将一个函数传递给'useState'的setter函数?

为什么必须在TS函数类型中指定参数名称?

为什么我必须在这一行声明类型

为什么我们必须在箭头符号(->)之后再次指定数据类型

为什么我必须在函数内部再次定义相同的变量?

为什么必须在符号名称中修饰返回类型中的decltype表达式?

在Python中,当我使用upper方法时,为什么我必须在upper之后放()?

我什么时候必须在 Qt 中包含 moc*.cpp?

为什么在Mingw中设置sdl时必须在主要函数中传递参数?

为什么必须在Fortran中隐式指定函数的双精度返回值?

为什么不能在jest.Mock(必须在spyOn上使用.mockImplementation)中模拟函数?

为什么必须在模板中每个函数上方声明模板?

node.js回调是否必须在nonce函数中?如果是这样,为什么?

为什么传递参数时必须在addeventlistener中具有匿名函数?