Function 传递隐式-这在Scala中可能吗?

Function 传递隐式-这在Scala中可能吗?,function,scala,implicit,Function,Scala,Implicit,假设我有几个函数: func1 : A => B func2: B => C func3: C => D 我希望在需要时以通用方式编排now功能 假设如果我需要从a转换到B,我会调用func1。 但是当我需要从a到D的转换时,我希望有这些函数的组合。这样的事情在动态概念中可能吗?来自Scala,解释了为什么在2.10中必须显式启用隐式转换: 为什么要控制它?隐式转换已知会导致许多陷阱 如果过度使用。而且有一种过度使用它们的趋势,因为它们 看起来非常强大,它们的效果似乎

假设我有几个函数:

func1 : A => B

func2:  B => C

func3:  C => D
我希望在需要时以通用方式编排now功能

假设如果我需要从
a
转换到
B
,我会调用
func1
。 但是当我需要从
a
D
的转换时,我希望有这些函数的组合。这样的事情在动态概念中可能吗?

来自Scala,解释了为什么在2.10中必须显式启用隐式转换:

为什么要控制它?隐式转换已知会导致许多陷阱 如果过度使用。而且有一种过度使用它们的趋势,因为它们 看起来非常强大,它们的效果似乎很容易理解。 此外,在大多数情况下,使用隐式参数会产生更好的效果 设计比隐式转换更有效

用户定义的隐式转换几乎总是一个坏主意,而让它们具有可传递性将是非常非常糟糕的

但是,您可以使用类型类以更安全、更可控的方式获得类似的效果。例如,假设我们有以下内容:

trait MyConverter[A, B] { def apply(a: A): B }

implicit def composeMyConverters[A, B, C](implicit
  ab: MyConverter[A, B],
  bc: MyConverter[B, C]
) = new MyConverter[A, C] { def apply(a: A) = bc(ab(a)) }
现在我们可以写:

implicit object doubleToString extends MyConverter[Double, String] {
  def apply(d: Double) = d.toString
}

implicit object intToDouble extends MyConverter[Int, Double] {
  def apply(i: Int) = i.toDouble
}

def convertToString[A](a: A)(implicit as: MyConverter[A, String]) = as(a)
最后:

scala> convertToString(13: Int)
res0: String = 13.0
我们从未明确定义过从整数到字符串的转换器,但编译器能够在需要时使用我们的
composeMyConverters
方法来构造一个转换器


与隐式转换一样,这种方法也可能被滥用,但更容易跟踪范围内的转换器、应用的位置等。

考虑到隐式转换已经占用了编译时间,降低了项目的整体可读性,从而降低了项目的整体生产效率,你想要什么听起来是个很糟糕的主意我喜欢你的方法Travis但实际上你是在把它们链接起来让它们可以传递是的但链接是自动发生的,这些不是隐式转换,它们是类型类实例,由编译器变出以满足隐式参数。请详细说明这一区别以及为什么它很重要?标准库中到处都有隐式转换,任何人都可以定义更多,而且它们可以应用于你可能不期望的地方。在我的示例中,您已经定义了类型类,因此您确切地知道哪些实例可用,并且转换不会自动应用。您必须使用我的
convertToString
方法中的隐式参数方法。嘿,Travis,我们只是尝试对较长的链(a->B->C->D)执行此操作,我们得到了不同的推导,这对我们来说是有意义的,因为函数组合是关联的,所以不同的分组会导致多个实例。我怀疑我们能否教scalac关于结合性的知识,所以我想知道是否有办法避免分歧。希望答案不是宏。