gpt4 book ai didi

针对变量的 Scala 匹配函数

转载 作者:行者123 更新时间:2023-12-02 03:37:53 25 4
gpt4 key购买 nike

当我匹配案例类的值时,例如:

sealed abstract class Op
case class UOp[T, K](f: T => K) extends Op
case class BOp[T, Z, K](f: (T, Z) => K) extends Op

像这样:

def f(op: Op): Int =
op match
{
case BOp(g) => g(1,2)
case UOp(g) => g(0)
}

编译器将其推断为

val g: (Nothing, Nothing) => Any
val g: Nothing => Any

为什么我得到的类型是 Nothing?是因为 JVM 类型删除吗?是否有优雅的方法将函数与变量匹配?

最佳答案

我提出了这个“hackish”解决方案,也许还有其他方法或更简洁的方法可以在不依赖反射的情况下做到这一点。

定义一些处理各种参数的偏函数:

scala> val f: PartialFunction[Any, String] = { case (x: Int, y: String) => y * x }
f: PartialFunction[Any,String] = <function1>

scala> val g: PartialFunction[Any, String] = { case x: Int => x.toString }
g: PartialFunction[Any,String] = <function1>

scala> def h: PartialFunction[Any, BigDecimal] = { case (a: Int, b: Double, c: Long) => BigDecimal(a) + b + c }
h: PartialFunction[Any,BigDecimal]

scala> val l: List[PartialFunction[Any, Any]] = f :: g :: h :: Nil
l: List[PartialFunction[Any,Any]] = List(<function1>, <function1>, <function1>)

检查哪些函数可以处理不同的输入:

scala> l.map(_.isDefinedAt(1))
res0: List[Boolean] = List(false, true, false)

scala> l.map(_.isDefinedAt((1, "one")))
res1: List[Boolean] = List(true, false, false)

给定输入查找并应用一个函数:

scala> def applyFunction(input: Any): Option[Any] = {
| l find (_.isDefinedAt(input)) map (_ (input))
| }
applyFunction: (input: Any)Option[Any]

scala> applyFunction(1)
res1: Option[Any] = Some(1)

scala> applyFunction((2, "one"))
res2: Option[Any] = Some(oneone)

scala> applyFunction("one")
res3: Option[Any] = None

scala> applyFunction(1, 1.1, 9L)
res10: Option[Any] = Some(11.1)

这看起来很不安全,必须有更好的方法来做到这一点。

我认为磁铁模式应该以更安全的方式处理这个问题。

关于针对变量的 Scala 匹配函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22176060/

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