不清楚的是;“已检查异常”;以「」;Scala中的函数式编程“;

不清楚的是;“已检查异常”;以「」;Scala中的函数式编程“;,scala,functional-programming,higher-order-functions,checked-exceptions,Scala,Functional Programming,Higher Order Functions,Checked Exceptions,在《Scala中的函数式编程》一书中,有几个词谈到了“检查异常”: 检查异常 Java的检查异常至少会强制决定是否处理或重新发送错误,但它们会为调用方提供重要的样板文件。更重要的是,它们不适用于高阶函数,因为高阶函数不可能知道它们的参数可能引发的特定异常。例如,考虑我们为列表定义的map函数: defmap[A,B](l:List[A])(f:A=>B:List[B] 此函数显然非常有用,非常通用,并且与检查异常的使用不一致-我们不能为f可能引发的每个检查异常都提供一个map版本。即使我们想这样

在《Scala中的函数式编程》一书中,有几个词谈到了“检查异常”:

检查异常

Java的检查异常至少会强制决定是否处理或重新发送错误,但它们会为调用方提供重要的样板文件。更重要的是,它们不适用于高阶函数,因为高阶函数不可能知道它们的参数可能引发的特定异常。例如,考虑我们为列表定义的map函数:

defmap[A,B](l:List[A])(f:A=>B:List[B]

此函数显然非常有用,非常通用,并且与检查异常的使用不一致-我们不能为
f
可能引发的每个检查异常都提供一个map版本。即使我们想这样做,map怎么知道哪些异常是可能的呢?这就是为什么泛型代码(即使在Java中)经常使用RuntimeException或一些常见的检查异常类型

这一节我读了好几遍,但仍然不清楚为什么选中的异常不适用于高阶函数


有人能举一些例子让它更清楚吗?

试着用Java编写函数
map
。在某个时候,您会发现自己需要调用映射函数。您的映射函数可以是任何类型,并抛出它喜欢的任何类型的异常。函数
map
不能在其签名中包含映射程序可以抛出的所有可能的异常,因为它不知道它是什么。如果有选中的异常,则无法写入
map
的类型签名

假设
map
的签名类似于
集合映射(函数、集合)
。现在假设我们将其称为
map(x->thrownioexception,list.of(1,2,3))
。由于选中了
IOException
,因此它应该出现在
map
的签名中,但在您调用
map
之前,它不知道它会引发这种类型的异常