有没有理由在一个不是部分的函数上使用PartialFunction?
scala> val foo: PartialFunction[Int, Int] = {
| case x => x * 2
| }
foo: PartialFunction[Int,Int] = <function1>foo被定义为PartialFunction,但case x当然会捕获所有输入。
这仅仅是糟糕的代码吗?因为PartialFunction类型向程序员表明,函数对于某些输入是未定义的?
发布于 2014-01-14 12:21:34
问题是,有很多时候,你需要在特征/对象/函数定义上定义的是一个PartialFunction,但实际上真正的实现可能不是这样的。举个例子,让我们来看看def collect[B](f: PartialFunction[A,B])
val myList = thatList collect {
case Right(value) => value
case Left(other) => other.toInt
}它显然不是“真正的”部分,因为它是为所有输入定义的。也就是说,如果我愿意,我可以只使用Right匹配。
但是,如果我将collect作为一个完整的普通函数来编写,那么我就会错过所需的行为(即在定义函数的时候将filter和map合并到一个基础上)。这是很好的行为,并且在编写我自己的代码时有很大的灵活性。
所以我想更好的问题是,你会希望行为反映一个函数可能不是到处定义的吗?如果答案是否定的,那就不要去做。
发布于 2014-01-15 01:53:44
使用PartialFunction而不是Function没有什么好处,但是如果必须传递PartialFunction,那么就必须传递PartialFunction。
请注意,由于这两者之间的继承,重载接受这两者的方法会导致一些难以使用的东西,因为类型推断将不起作用。
发布于 2014-01-14 13:44:49
PartialFunction文本允许直接在参数上进行模式匹配(例如,{ case (a, b) => ... }而不是_ match { case (a, b) => ... }),这使得代码更具可读性(参见@wheaties的答案以获得另一个示例)。
编辑:显然这是错误的,请参阅Daniel C.Sobral对他的回答的评论。不删除,这样评论仍然有意义。
https://stackoverflow.com/questions/21105923
复制相似问题