0

如果这个问题是重复的,请原谅我;我找不到任何东西,因为我不知道要搜索的正确单词。因此,使用隐式 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)))

这让我可以somef使用 Seq[(String, Int)] 对象作为参数进行调用。问题是我有这样的东西......

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

这不起作用:

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

我怎么能做到这一点而不做一个implicit def专门的(Seq[(String, Int)]) => Int

4

1 回答 1

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
}

然后你应该可以打电话somef2p

于 2012-12-07T04:29:25.717 回答