1

型付けされていないプロジェクトを 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"があり、パターン マッチングの場合はそれを「タグ」に減らす必要があると考えているためです。 .

要求された動作をどのように実装できますか?

4

1 に答える 1