使用隐式def与组合类型

时间:2012-12-07 03:43:17

标签: scala types implicit-conversion

如果这个问题是重复的,请原谅我;我找不到任何东西,因为我不知道要搜索的正确单词。因此,使用隐式def,我可以做这样的事情:

type CharsetMap = Map[Charset, Byte]

implicit def seqtup2CharsetMap(input: Seq[(String, Int)]): CharsetMap = {
  Map.empty  // placeholder
}

def somef(a: Int, b:Int, p: CharsetMap) = p
somef(1, 3, Seq(("hey", 2), ("there", 9)))

允许我使用Seq [(String,Int)]对象作为参数调用somef。问题是我有这样的事情......

def somef2(p: (CharsetMap) => Int) = p

这不起作用:

val p = (a: Seq[(String, Int)]) => 19
somef2(p)

如果不专门为implicit def执行(Seq[(String, Int)]) => Int,我该怎么做呢?

1 个答案:

答案 0 :(得分:2)

看起来您希望隐式地将某个函数A => B转换为来自C => B的函数。您可以使用此通用隐式执行此操作:

implicit def f2InputConverter[A, B, C](f: A => B)(implicit i: C => A): C => B = (c: C) => f(i(c))

一旦你有了范围,在你的特定情况下,你需要一个隐含的函数,它与你在问题中定义的函数相反:

implicit def charsetMap2Seqtup(input: CharsetMap): Seq[(String, Int)] = {
  Nil  // placeholder
}

然后您应该可以使用somef2

致电p