gpt4 book ai didi

scala - 通用操作的高阶函数

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

我有以下枚举

sealed trait DataTyp
case class IntN(n: Int) extends DataTyp
case class FltN(n: Float) extends DataTyp
case class StrL(d: String) extends DataTyp
case class Bool(b: Boolean) extends DataTyp

我想对它们执行算术、关系和逻辑运算。执行此操作时可能会优化明显的代码重复。而不是为了执行正确的操作格式而进行大量的模式匹配。有没有办法做一个通用函数,我可以在进行模式匹配时将其作为参数传递?鉴于在模式匹配中大部分时间唯一变化的是操作函数。

我已经知道你可以用这样的东西做通用的算术运算方法:

  def add[T](x: T, y: T)(implicit num: Numeric[T]): T = {
import num._
x + y
}

但由于某些原因我不能将类型参数用作函数(仅在方法上)。那我该怎么办?

最佳答案

它没有很好的语法,但很多时候使用了 scala 用于 A => B 的相同技巧:使用特征。

trait MyGenericOperation {
def add[T](x: T, y: T)(implicit num: Numeric[T]): T = {
import num._
x + y
}
}

你还可以进一步抽象:

trait GenFunctionTTTWithTC[TC[_]] {
def apply[T: TC](x: T, y: T): T
}

注意转换所有可能的高阶签名([A, B](A, B) => A), [A, B](A, B) = > B), [A, B, C](A, B) => C), ...),你需要大量的特征。

kind projector 插件实现了 certain kind of polymorphic lambda 的语法对应于自然转化。这可能对您的用例没有用,我指出这一点只是为了表明人们已经考虑扩展 Scala 语法以简化对类型参数函数的抽象。

关于scala - 通用操作的高阶函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43664860/

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