首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >不是部分的PartialFunction

不是部分的PartialFunction
EN

Stack Overflow用户
提问于 2014-01-14 12:08:17
回答 3查看 122关注 0票数 2

有没有理由在一个不是部分的函数上使用PartialFunction

代码语言:javascript
复制
scala> val foo: PartialFunction[Int, Int] = {
     | case x => x * 2
     | }
foo: PartialFunction[Int,Int] = <function1>

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

这仅仅是糟糕的代码吗?因为PartialFunction类型向程序员表明,函数对于某些输入是未定义的?

EN

回答 3

Stack Overflow用户

发布于 2014-01-14 12:21:34

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

代码语言:javascript
复制
val myList = thatList collect {
  case Right(value) => value
  case Left(other) => other.toInt
}

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

但是,如果我将collect作为一个完整的普通函数来编写,那么我就会错过所需的行为(即在定义函数的时候将filtermap合并到一个基础上)。这是很好的行为,并且在编写我自己的代码时有很大的灵活性。

所以我想更好的问题是,你会希望行为反映一个函数可能不是到处定义的吗?如果答案是否定的,那就不要去做。

票数 4
EN

Stack Overflow用户

发布于 2014-01-15 01:53:44

使用PartialFunction而不是Function没有什么好处,但是如果必须传递PartialFunction,那么就必须传递PartialFunction

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

票数 4
EN

Stack Overflow用户

发布于 2014-01-14 13:44:49

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

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

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21105923

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档