gpt4 book ai didi

scala - 我可以像使用C++模板特化一样专门化Scala中的函数类型参数吗?

转载 作者:行者123 更新时间:2023-12-04 16:32:03 29 4
gpt4 key购买 nike

我想编写一个函数,该函数的行为取决于其类型参数。
下面是我想要的一个简单示例:

def f[Int] = "I'm an int"
def f[Float] = "I'm a float"
def f[Burger] = "You want fries with that?"

在Scala中这可能吗,还是我需要解决一些问题?

最佳答案

不直接在Scala中执行此操作的通常方法是使用类型类。

trait FAble[T] { def doF: String }
object FAble {
implicit val fInt = new FAble[Int] { def doF = "I'm an int" }
implicit val fFloat = new FAble[Float] { def doF = "I'm a float" }
implicit val fBurger = new FAble[Burger] { def doF = "You want fries?" }
}

def f[T](implicit ev: FAble[T]) = ev.doF
// or
def f[T: FAble] = implicitly[FAble[T]].doF

稍微冗长一点,但它也有一些优点-可以计算隐式实例(使用 implicit def而不是 val),并且任何给定类型的实例都可以有多个,这使您可以选择行为通过在代码的不同点使作用域具有不同的实例。

您无法使用C++方式执行此操作的原因是Scala泛型不涉及针对不同类型参数的代码生成(不包括 @specialized,因为它也不执行您想要的操作)。因此,说“嘿编译器,当您在该位置看到一个Int时,而不是从通用模板生成代码,而是使用此特定代码”是没有意义的。

关于scala - 我可以像使用C++模板特化一样专门化Scala中的函数类型参数吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11680495/

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