将Map作为(flatMap)映射函数传递会导致错误

时间:2013-10-28 04:10:12

标签: scala functional-programming

我有一张地图:

  val mnem = Map(
    '2' -> "ABC", '3' -> "DEF", '4' -> "GHI", '5' -> "JKL",
    '6' -> "MNO", '7' -> "PQRS", '8' -> "TUV", '9' -> "WXYZ")

我很好奇为什么我不能将此地图作为映射函数传递,因为Map既是集合又是函数,如下面

val digits = "2345"                       //> digits  : String = 2345

digits flatMap mnem                       //> ERROR

但我能做到这一点

digits flatMap(mnem(_))                   //> res0: String = ABCDEFGHIJKL

我试图做一些类似的事情:

digits map mnem                           //> res1: scala.collection.immutable.IndexedSeq[String] = Vector(ABC, DEF, GHI, 
                                              //| JKL)    

3 个答案:

答案 0 :(得分:4)

Map[Char, String]是一个函数(Char => String)

trait Map[A, +B] extends ... MapLike[A, B, Map[A, B]] 
trait MapLike[A, +B, ...] extends PartialFunction[A, B] ...
trait PartialFunction[-A, +B] extends (A) ⇒ B

这很好用:

val f: Char => String = mnem

digits flatMap f会出现同样的错误。

flatMap上的{p> StringChar ⇒ GenTraversableOnce[B]作为参数。 String不是GenTraversableOnce,因此(Char => String)(和Map[Char, String])不是Char ⇒ GenTraversableOnce[B]

Scala将Map.applyMap(_)重写为x => Map(x) ,然后将隐式转化应用于功能结果:

x => augmentString(Map(x))

它可以将Map(x)转换为获取Char ⇒ GenTraversableOnce[Char]类型的函数,但它无法将Char => String类型的现有函数转换为Char ⇒ GenTraversableOnce[Char],因为没有这样的隐式转换是范围。

答案 1 :(得分:3)

获得等效的行

digits flatMap(mnem(_)) // mnem's apply method is the actual method passed to flatMap

你想要

digits flatMap mnem.apply

答案 2 :(得分:-1)

由于Map不是函数,因此apply方法中定义的Map方法可以将Map的对象充当方法 }}。 flatMap需要一个函数(不是一个方法),这就是你需要使用mnem(_)将它转换为函数的原因。