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>
作为返回类型。
答案 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
提供一些不同的语法。它已经足够复杂了。