首页 > 解决方案 > 这个 Scala 部分函数是如何工作的?

问题描述

// First using normal dictionary lookup
def findElement(e: String, dict: Map[String, Any]): Option[Any] = dict.get(e)
;

// Second using Partial function
def findElement(e: String, dict: Map[String, Any]): Option[Any] = dict.find { case (k, v) => k == e } map (_._2)


他们都给出了相同的答案,但是,第二个函数是如何工作的?

使用 case 关键字的偏函数的 BigO 是什么?它是否遍历地图的所有元素以找到正确的键?

标签: scalafunctional-programming

解决方案


你需要知道的几件事:

  • Map[A, B]也是一个PartialFunction[A, B]
  • 部分函数有lift方法把它变成A => Option[B]-get基本上变成apply.lift _
  • Map也可以被视为对序列 ( Seq[(A, B)]) - 当你map, flatMap,collect等时你可以看到find
  • find是一个函数,它返回集合的第一个元素(在Map' 的情况下它是一对) - 如果集合中没有这样的元素,则None处理它
  • { case (k,v) => }使用模式匹配从元组中提取值并将其放入值kv
  • _._2是一个元组方法(返回第二个值)。

考虑到这一点:

dict.get(e)


是......很明显 - 键的返回值e,如果它存在,则将其包装,Some否则返回Noneapply将抛出缺失值)。

dict.find { case (k, v) => k == e } map (_._2)


它将尝试找到第一个元素 where k == e,返回Option[(String, Any)],然后通过将整个元组转换为第二个值map来转换值(如果存在)。Option


推荐阅读