为什么scala没有内置的PartialFunctionN?

时间:2014-03-13 07:10:08

标签: scala

scala内置FunctionN特征,最高为Function22。拥有相应的PartialFunctionN似乎很自然。那为什么斯卡拉没有呢?是否有一个固有的原因,为什么它不包含在scala中?

我自己很容易实现接近PartialFunctionN的内容。我们当然可以定义明显的:

type PartialFunction2[-T1,-T2,+R] = PartialFunction[Tuple2[T1,T2],R]

但返回的类型实际上是:

scala>  val f: PartialFunction2[Int,Int,Int] = {case (2,3) => 8; case (3,2) => 9}
f: PartialFunction2[Int,Int,Int] = <function1>

scala> f(2,3)
res0: Int = 8

scala> f(2,7)
scala.MatchError: (2,7) (of class scala.Tuple2$mcII$sp) ...

令人困惑,因为它看起来像<function2>而不是<function1>

另一种方法是递归定义{{​​1}}:

PartialFunctionN

但是这个用法不像上一个例子那样漂亮和干净,我们仍然得到type PartialFunction2[-T1,-T2,+R] = PartialFunction[T1,PartialFunction[T2,R]]

<function1>

所以,基本上,我很想知道scala为什么没有内置scala> val g: PartialFunction2[String,String,String] = { case "x" => {case "y" => "male"; case "x" => "female"} } g: PartialFunction2[String,String,String] = <function1> scala> g("x")("y") res0: String = male scala> g("x")("x") res1: String = female scala> g("y")("x") scala.MatchError: y (of class java.lang.String) ... 这是一个很好的理由,作为奖励,我也想要了解是否有模仿预期功能的方法,并获得PartialFunctionN而不是<functionN>作为返回类型。

1 个答案:

答案 0 :(得分:1)

  

并获取<functionN>而不是<function1>作为返回的类型

f: PartialFunction2[Int,Int,Int] = <function1>

类型 PartialFunction2[Int,Int,Int],就像您想要的那样。 <function1>是调用toString以在REPL中显示函数的结果。请注意,鉴于您的定义PartialFunction2[Int,Int,Int]PartialFunction,因此是Function1,而不是Function2。你可以定义

trait PartialFunction2[-T1,-T2,+R] extends Function2[T1,T2,R] {
  def isDefinedAt(x: T1, y: T2): Boolean
}

但你不会得到任何好的语法(你可以添加从PartialFunction[Tuple2[T1,T2],R]PartialFunction2[T1,T2,R]的隐式转换。)

  

我很想知道scala为什么没有PartialFunctionN内置

的充分理由

如果您在标准库中有PartialFunction2,并且它是按照您所需的语法创建的,那么您必须为元组的PartialFunction提供一些不同的语法。它已经足够复杂了。