型付けされていないプロジェクトを Scala 3 で型付けされるように移植できるかどうか、非常に興味がありました。ここから始めました。
object Main {
type HtmlNodeRecord[X]= X match {
case "tag" => String
case "attrs" => List[(String, String)]
case "children" => List[HtmlNode]
}
case class HtmlNode(tag: String, attrs: List[(String, String)], children: List[HtmlNode]) {
def apply(s: "tag" | "attrs" | "children"): HtmlNodeRecord[s.type] = s match {
case "tag" => tag
case "attrs" => attrs
case "children" => children
}
}
}
コンパイルされず、エラーがスローされます。
> [E007] Type Mismatch Error: Main.scala:10:22
> [error] 10 | case "tag" => tag
> [error] | ^^^
> [error] | Found: (HtmlNode.this.tag : String)
> [error] | Required: Main.HtmlNodeRecord[
> [error] | (s : ("tag" : String) | ("attrs" : String) | ("children" : String))
> [error] | ]
これは、パターン マッチングを s の「タイプ フィルター」として認識していないという事実から来ていると思います。この場合、 s にはタイプ"tag" | "attrs" | "children"
があり、パターン マッチングの場合はそれを「タグ」に減らす必要があると考えているためです。 .
要求された動作をどのように実装できますか?