为什么要提供部分功能来在运行时映射抛出而不是产生编译错误?

斯坦·L

道歉,如果这很明显,但是我是scala的新手,并且使用以下代码遇到了两种意外行为:

Seq(1, "a", 2, "b") map { 
    case i: Int => i+1
}

1)我本来希望重新获得一个集合,在该集合中字符串不变,数字递增1,但我却报错。

2)我相信case i: Int => i + 1语法代表为Ints定义的部分函数。但是看来map需要一个总函数,那么为什么还要编译呢?编译器帮助我会更好吗?最好将运行时异常移至编译时间异常。

w

map()不会将部分函数用作传递的参数,但collect()会这样做。

Seq(1, "a", 2, "b") collect {
  case i: Int => i+1
}
//res0: Seq[Int] = List(2, 3)

请注意,未为部分函数定义的输入是如何不传递而是被丢弃的。您不希望删除的内容需要一个处理程序,即使它只是case _ =>默认处理程序。

Seq(1, "a", 2, "b", 'z') collect {
  case i: Int    => i+1        //increment ints
  case c: Char   => c.toUpper  //capitalize chars
  case s: String => s          //strings pass through
}
//res0: Seq[Any] = List(2, a, 3, b, Z)

当您将部分函数传递给map()编译器时,不会抱怨trait PartialFunction[-A, +B] extends (A) => B换句话说,部分函数一种函数。

值得注意的是,在处理部分函数时...

呼叫者有责任在致电isDefinedAt之前致电apply...

因此,我们可以得出结论,那就是这样collect()做,而map()不是。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

编译错误失败,而不是在运行时抛出“未解决的编译问题”

为什么在运行时出现Typescript编译错误?

为什么BufferedReader类在编译时而不是在运行时产生异常

为什么某些类型的Set缺少运行时错误而不是编译错误?

为什么GoLang方法会产生编译错误?

为什么#region会产生编译错误?

为什么使用方法参照以下铸件不会产生编译错误?

Java泛型-为什么返回超类实例会产生编译错误

为什么dart不会抛出编译时错误类型异常。运行时间?

为什么格式错误的XAML似乎会编译,然后在运行时失败?

函数产生编译错误

为什么该程序在运行时出现错误

Microsoft.AspNet.WebApi.HelpPage版本4.0.30506在运行时出现编译错误

为什么keras模型可以编译,但是fit_generator命令会抛出“模型未编译的运行时错误”?

为什么模式“\(”在 Perl 中为正则表达式匹配产生编译错误?

为什么在运行时而不是在编译时评估使用constexpr初始化变量

Visual Studio/C++:反向迭代器编译,但在运行时抛出错误

为什么要引入运行时?

Java-什么时候发生编译器错误,什么时候发生运行时异常?

Micronaut中的DI错误在运行时而不是编译时出现?

为什么数组的负数大小不是编译错误而是抛出java.lang.NegativeArraySizeException

使用非可比较类创建TreeSet:为什么运行时异常而不是编译时错误?

为什么Swift解释器会为引发运行时错误而不是类名的实例提供内存位置?

为什么 `constexpr` 函数在编译和运行时会产生不同的结果?

C++嵌套SFINAE模板产生编译错误

设置委托会产生编译错误

std :: bind在libstdc ++中产生编译错误

Apple 的 SwiftUI 教程产生编译错误

Fortran读取语句不产生编译错误