gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 22:03:34 24 4
gpt4 key购买 nike

假设我有几个功能:

func1 : A => B

func2: B => C

func3: C => D

我想在需要时以通用方式编排现在的功能。

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

最佳答案

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

Why control it? Implicit conversions are known to cause many pitfalls if over-used. And there is a tendency to over-use them because they look very powerful and their effects seem to be easy to understand. Also, in most situations using implicit parameters leads to a better design than implicit conversions.

用户定义的隐式转换几乎总是一个坏主意,让它们具有传递性会更糟糕。

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

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 方法来构造一个转换器。

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

关于function - 传递隐式 - 这在 Scala 中可能吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19335385/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com