创建地图字符串 - > Scala中的函数

时间:2014-07-31 12:19:08

标签: scala map

我需要将字符串映射到函数。我尝试了以下方法:

def a(a: Int,..) = ... 

表示具有各种参数的泛型函数,

然后

val m: Map[String, Funcs] = Map("a"-> a)

其中

 type Funcs = (Any*) => Any

但它并没有真正起作用..我想用字符串作为键来制作混合函数的映射。

1 个答案:

答案 0 :(得分:2)

这并不容易。事实上,在运行时几乎不可能做到这一点。在编译时,您可以使用几个技巧,所有这些技巧都可以在库Shapeless中找到。你不必使用Shapeless作为Miles showed in a gist,他解释说:

trait Assoc[K] { type V ; val value: V }
def mkAssoc[V0](k: String, v: V0): Assoc[k.type] { type V = V0 } = new Assoc[k.type]{ type V = V0 }

现在在编译时你可以匹配你需要的所有不同的东西

implicit def fAssoc = mkAssoc("f", f)
implicit def gAssoc = mkAssoc("g", g)

并将其检索为

def lookup(k: String)(implicit assoc: Assoc[k.type]): assoc.V = assoc.value

如果你把这些推到像他用HMap完成的课程中,你可以按照Poly1的方式做一些事情:

abstract class FMapper{
  protected def mkAssoc[V0](k: String, v: V0): Assoc[k.type] { type V = V0 } = 
    new Assoc[k.type]{ type V = V0 }

  def apply(k: String)(implicit assoc: Assoc[k.type]): assoc.V = assoc.value

并创建一个类,如

class Mapped extends FMapper{
  implicit val f = mkAssoc("f", f)
  implicit val g = mkAssoc("g", g)

但正如你所看到的,它开始变得难看......