gpt4 book ai didi

scala - Scala 中的类型推断和模式匹配

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

这不会输入:

sealed trait BinOp[-InA, -InB, +Out]
case object Add extends BinOp[Int, Int, Int]

sealed trait Expression[+A]
final case class IntegerAtom(value: Int) extends Expression[Int]
final case class BinaryExp[-A, -B, +C](op: BinOp[A, B, C], lhs: Expression[A], rhs: Expression[B]) extends Expression[C]

def optimizeStep[A](x: Expression[A]): Expression[A] = x match {
case BinaryExp(Add, IntegerAtom(a), IntegerAtom(b)) => IntegerAtom(a + b)
}

最直接的是在模式匹配中使用 case 对象:
[error] (...) pattern type is incompatible with expected type;
[error] found : minimumexample.Add.type
[error] required: minimumexample.BinOp[Any,Any,A]

看来这可以通过引入eye-bleeding来解决:
val AddOp = Add

进而:
case BinaryExp(AddOp, IntegerAtom(a), IntegerAtom(b)) => IntegerAtom(a + b)

但是之后:
[error] (...) type mismatch;
[error] found : minimumexample.IntegerAtom
[error] required: minimumexample.Expression[A]
[error] case BinaryExp(AddOp, IntegerAtom(a), IntegerAtom(b)) => IntegerAtom(a + b)
[error] ^

我想尽可能安全地解决这个问题,而不是求助于 .asInstanceOf[] .想法?

最佳答案

您的代码的主要问题是 BinaryExp 定义中的差异问题。 ,但这似乎不在问题的范围内。一旦确定了方差,唯一的不便就是 case object不引入新类型。

解决此问题的典型模式是声明 sealed trait然后有一个 case object延长它。

这是一个编译的例子

sealed trait BinOp[-InA, -InB, +Out]
sealed trait Add extends BinOp[Int, Int, Int]
case object Add extends Add

sealed trait Expression[+A]
final case class IntegerAtom(value: Int) extends Expression[Int]
final case class BinaryExp[A, B, C](op: BinOp[A, B, C], lhs: Expression[A], rhs: Expression[B]) extends Expression[C]

def optimizeStep[A](x: Expression[A]): Expression[A] = x match {
case BinaryExp((_: Add), IntegerAtom(a), IntegerAtom(b)) => IntegerAtom(a + b)
}

在哪里:
  • 差异以天真的方式“固定”(删除它)
  • Add由于 sealed trait 现在是一种类型定义
  • 匹配使用 (_: Add) 执行
  • 关于scala - Scala 中的类型推断和模式匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31434934/

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