scala - 如何确保内联类型匹配(scala 3)中的两个参数引用相同的类型

标签 scala pattern-matching inline scala-3

在 scala 3 中,使用内联匹配时,如何确保两个类型参数相同。

class Div[A,B]
transparent inline def simplify [A](a: QuantityUnit[A]) = 
  inline a match {
    // only match if a and b are the same
    case _: Div[a,b] /* a =:= b */ => "string" 
    case _ => 24
  }

// should produce 24 because the type params are different
val a: String = simplify(new Div[Boolean,Int])

// should produce "string" because the type params are the same
val b: Int = simplify(new Div[Boolean,Boolean])

这是关键行,我想表达的是注释掉的内容:

case _: Div[a,b] /* a =:= b */ => "string"

我想出的最好的办法是这样的:

case _: Div[a,b] => inline erasedValue[b] match {
  case _: a => "string"
  case _ => ...
}

但它迫使我突破主要的比赛语句。

最佳答案

我偶然发现了一些似乎有效的东西。最简单的版本:

// type alias
type SameParamDiv[A] = Div[A,A]

...

case _: SameParamDiv[a] => "string" 

我尝试内联同样的事情:

 case _ : (([a] =>> Div[a,a])[_]) => {

我不太确定语法,但它似乎有效:D

为了完整起见,这里有一些不起作用的东西:

// never matches
case _ : Div[a,b] if erasedValue[a] == erasedValue[b] => 

关于scala - 如何确保内联类型匹配(scala 3)中的两个参数引用相同的类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67680285/

相关文章:

scala - 在 SBT 中运行代码时出现 ClassCastException

Javascript - 如何使用变量分隔符进行分割功能?

scala - Class[_] 类型的模式匹配?

c# - 在同一行 2 上对齐 html 输入

ScalaTest Matchers 与 MustMatchers 的区别

scala - 我应该如何等待 scala dispatch (0.11.0) http get 请求完成?

scala - 类型类派生访问默认值

perl 只查找和替换完全匹配

c - c 中的内联函数

c++ - 如果仅在其中一个地方手动内联,如何保持在 2 个地方调用的 C++ 函数的一致性