Scala中的部分函数

jst*_*hng 11 scala

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

val f: PartialFunction[Any, Int] = {...}
Run Code Online (Sandbox Code Playgroud)

我想知道,对于类型AB,是A一个参数,B返回类型?如果我有多种可接受的类型,我是否可以orElse将部分功能链接在一起?

M.K*_*.K. 11

在函数的集合理论视图中,如果函数可以将域中的每个值映射到范围中的值,我们说这个函数是a total function.可能存在这样的情况:函数无法将域中的某些元素映射到该范围; 这样的功能被称为partial functions.

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

val isEven: PartialFunction[Int, String] = {
  case x if x % 2 == 0 => x+" is even"
}
Run Code Online (Sandbox Code Playgroud)

这里定义了部分函数,​​因为它被定义为仅将偶数整数映射到字符串.因此,partial函数的输入是一个整数,输出是一个字符串.

val isOdd: PartialFunction[Int, String] = {
  case x if x % 2 == 1 => x+" is odd"
}
Run Code Online (Sandbox Code Playgroud)

isOdd是另一个部分函数,​​类似地定义isEven为奇数.同样,partial函数的输入是一个整数,输出是一个字符串.

如果您有一个数字列表,例如:

List(1,2,3,4,5)
Run Code Online (Sandbox Code Playgroud)

isEven在此列表中应用部分函数,​​您将获得输出

List(2 is even, 4 is even)
Run Code Online (Sandbox Code Playgroud)

请注意,并非原始列表中的所有元素都已由partial函数映射.但是,在某些情况下,您可能希望在部分函数无法将元素从域映射到范围的情况下应用其他函数.在这种情况下,我们使用orElse:

val numbers = sample map (isEven orElse isOdd)
Run Code Online (Sandbox Code Playgroud)

现在你将获得输出:

List(1 is odd, 2 is even, 3 is odd, 4 is even, 5 is odd)
Run Code Online (Sandbox Code Playgroud)