Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala中的部分函数_Scala - Fatal编程技术网

Scala中的部分函数

Scala中的部分函数,scala,Scala,我只是想澄清一下Scala中部分定义的函数。我看了文档,它说部分函数的类型是PartialFunction[a,B],我可以定义一个部分函数,比如 val f: PartialFunction[Any, Int] = {...} 我想知道,对于A和B类型,A是参数,而B是返回类型吗?如果我有多个可接受的类型,我是否使用orElse将部分函数链接在一起?在函数的集合论视图中,如果函数可以将域中的每个值映射到范围内的一个值,则我们称此函数为总函数。在某些情况下,函数无法将域中的某些元素映射到范围;

我只是想澄清一下Scala中部分定义的函数。我看了文档,它说部分函数的类型是
PartialFunction[a,B]
,我可以定义一个部分函数,比如

val f: PartialFunction[Any, Int] = {...}

我想知道,对于
A
B
类型,
A
是参数,而
B
是返回类型吗?如果我有多个可接受的类型,我是否使用
orElse
将部分函数链接在一起?

在函数的集合论视图中,如果函数可以将域中的每个值映射到范围内的一个值,则我们称此函数为
总函数。在某些情况下,函数无法将域中的某些元素映射到范围;这种函数称为
部分函数

以Scala文档中的部分函数为例:

val isEven: PartialFunction[Int, String] = {
  case x if x % 2 == 0 => x+" is even"
}
这里定义了分部函数,因为它被定义为仅将偶数整数映射到字符串。因此,分部函数的输入是一个整数,输出是一个字符串

val isOdd: PartialFunction[Int, String] = {
  case x if x % 2 == 1 => x+" is odd"
}
isOdd
是另一个类似定义为
isEven
但用于奇数的分部函数。同样,分部函数的输入是整数,输出是字符串

val isOdd: PartialFunction[Int, String] = {
  case x if x % 2 == 1 => x+" is odd"
}
如果您有一个数字列表,例如:

List(1,2,3,4,5)
并在此列表上应用
isEven
partial函数作为输出

List(2 is even, 4 is even)
请注意,并非原始列表中的所有元素都已被partial函数映射。但是,在某些情况下,如果部分函数无法将元素从域映射到范围,则可能需要应用另一个函数。在这种情况下,我们使用
orElse

val numbers = sample map (isEven orElse isOdd)
现在您将获得以下输出:

List(1 is odd, 2 is even, 3 is odd, 4 is even, 5 is odd)

如果您希望设置一个实际上包含多个参数的分部函数,请在要输入的参数元组上定义分部函数,例如:

val multiArgPartial: PartialFunction[(String, Long, Foo), Int] = {
  case ("OK", _, Foo("bar", _)) => 0 // Use underscore to accept any value for a given parameter
}

当然,还要确保将参数作为元组传递给它。

除了其他答案外,如果“多个接受类型”的意思是您想要相同的函数接受,例如
String
Int
Boolean
(没有其他类型),则称为“联合类型”,目前Scala不支持这种类型(但计划在未来进行,基于)。备选方案包括:

  • 使用最不常见的超类型(
    Any
    用于上述情况)。这就是
    orElse
    链的作用
  • 使用类似于
    other[String,other[Int,Boolean]]
    的类型。如果有两种类型,这很好,但很快就会变得难看
  • 将联合类型编码为

  • 是的,这是正确的想法。应用isEven函数的确切含义是什么。如果它意味着映射“List(1,2,3,4,5)map isEven”,它将导致scala.MatchError:1(类java.lang.Integer)@AbhishekGayakwad,不。在这种情况下,您必须使用
    collect
    。您不能使用
    map
    ,因为对于
    奇数
    数字,它显然会失败。
    collect
    首先使用
    isDefinedAt
    功能进行检查。