部分功能不是部分功能

时间:2014-01-14 04:08:17

标签: scala

是否有理由对不属于偏的函数使用PartialFunction

scala> val foo: PartialFunction[Int, Int] = {
     | case x => x * 2
     | }
foo: PartialFunction[Int,Int] = <function1>

foo被定义为PartialFunction,但当然case x会捕获所有输入。

这是不好的代码,因为PartialFunction类型向程序员表明某些输入的函数未定义?

3 个答案:

答案 0 :(得分:4)

问题是,有很多例子表明你需要在特征/对象/函数定义上定义的是PartialFunction,但实际上真正的实现可能不是一个。举个例子,看看def collect[B](f: PartialFunction[A,B])

val myList = thatList collect {
  case Right(value) => value
  case Left(other) => other.toInt
}

它显然不是“真实的”部分,因为它是为所有输入定义的。也就是说,如果我愿意,我可以进行Right匹配。

但是,如果我将collect写成一个完整的普通函数,那么我就会错过所期望的行为(即filter和{{1}在定义函数时将其置于一个基础上。)这是一个很好的行为,并且在编写自己的代码时可以提供很大的灵活性。

所以我想更好的问题是,您是否希望行为反映出函数可能无法在任何地方定义?如果答案是否定的,则不要这样做。

答案 1 :(得分:4)

使用PartialFunction代替Function没有任何优势,但如果您必须传递PartialFunction,则必须传递PartialFunction。< / p>

请注意,由于这两者之间的继承,重载方法以接受这两者会导致难以使用的东西,因为类型推断将无法工作。

答案 2 :(得分:3)

PartialFunction文字允许直接在参数上进行模式匹配(例如{ case (a, b) => ... }而不是_ match { case (a, b) => ... }),这使代码更具可读性(请参阅@wheaties的答案另一个例子)。

编辑:显然这是错误的,请参阅Daniel C. Sobral对他答案的评论。不删除,以便评论仍然有意义。