【问题标题】:Using implicit def with composed types对组合类型使用隐式 def
【发布时间】:2012-11-25 05:55:25
【问题描述】:

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

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

【问题讨论】:

  • 您的p 函数不能接受Charset 参数,而您在调用它时插入Seq[(String, Int)] 值的任何原因?
  • @Kane,也许不是,但我认为是。所以上下文是我正在使用 Playframework 的 Scalaforms DSL,我正在尝试使用 seqtuple 将 HTML 表单输入转换为 CharsetMap。我想也许我可以写一些类似于seq 的东西,它返回一个 Map 而不是 Seq,但我希望我可以用隐式 def 来做到这一点。

标签: scala types implicit-conversion


【解决方案1】:

您似乎想将某个函数 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
}

然后您应该可以使用p 调用somef2

【讨论】:

  • 出于某种原因,我的 ABC 走上了另一条路。只是为了显示 alt 语法,implicit def fg[A,B,C](f: Function1[B,C])(implicit cv: Function1[A,B]): Function1[A,C] = cv andThen f
  • 这样更好。我可能错了,但我认为这种模式只是一个仿函数。基本上给定一个 A => B,仿函数将其提升为 F[A] => F[B]。在这种情况下,F 将是 Function2[_, T] 。我无法理解的是,为什么对于那个 F,我们需要一个 B => A 来获得一个 F[A] => F[B]。
  • 哇,这太疯狂了。所以我在我的问题中对其进行了简化,但对于我的实际用例somef2 实际上采用了一个带有 8 个参数的函数。我希望找到一个灵活的解决方案,不需要随着参数的增长/缩小而改变,也许我会采取与implicit defs 不同的方法。
  • 当相关函数采用 8 个参数时,这是必要的定义:implicit def f2InputConverter[A, B, C, D, E, F, G, H, I, J](fun: (A,D,E, F, G, H, I, J) => B)(implicit imp: C => A): (C,D,E, F, G, H, I, J) => B = (c: C, d:D, e:E, f:F, g:G, h:H, i:I, j:J) => fun(imp(c),d,e,f,g,h,i,j) 这有一个主要警告,即它仅在您要转换的参数是第一个参数时才有效。
猜你喜欢
  • 2011-06-20
  • 1970-01-01
  • 2011-09-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-23
  • 1970-01-01
  • 2016-07-20
相关资源
最近更新 更多