gpt4 book ai didi

scala - Scala 3/Dotty 中的依赖元组

转载 作者:行者123 更新时间:2023-12-04 15:15:08 26 4
gpt4 key购买 nike

我正在尝试使用依赖元组列表对依赖映射进行编码。这是我所拥有的不起作用的东西:

  class DTuple[Key, ValueMap[_ <: Key]](val first: Key)(val second: ValueMap[first.type])

type DKey = "Tag" | "Versions" | "Author"

type DMapping[X <: DKey] = X match {
case "Tag" => String
case "Versions" => Array[String]
case "Author" => String
}

def mkString(d: DTuple[DKey, DMapping]) = d.first match {
case _: "Tag" => "#" + d.second
case _: "Versions" => d.second.mkString(",")
case _: "Author" => "@" + d.second
}

我得到的只是

[error] -- [E008] Not Found Error: Main.scala:21:35
[error] 21 | case _: "Versions" => d.second.mkString(",")
[error] | ^^^^^^^^^^^^^^^^^
[error] | value mkString is not a member of Main.DMapping[(d.first : Main.DKey)]

我想不出模式匹配 d.second 的好方法,使其类型依赖于 d.first。我可以添加 .asInstanceOf[Array[String]].asInstanceOf[String] 但这不是这里的目标,我正在尝试对代码进行类型检查。

最佳答案

可能有更好更简单的方法来做到这一点,但是:

import java.time.ZonedDateTime
import java.time.format.DateTimeFormatter.ISO_ZONED_DATE_TIME

// This is a case case solely for the unapply method, you could implement it on your own
case class DTuple[Key, ValueMap[_ <: Key]](first: Key)(val second: ValueMap[first.type])

type DKey = "Tag" | "Versions" | "Author" | "BuildTime"

type DMapping[X <: DKey] = X match {
case "Tag" => String
case "Versions" => Array[String]
case "Author" => String
case "BuildTime" => ZonedDateTime
}

// the DTuple("<value>") is used at runtime to check the string (DKey) value
// the DTuple["<value>", DMapping] type hint makes dotty see the `d` value as the correct type, hence infering the type of d.second too
def mkString(dt: DTuple[DKey, DMapping]): String = dt match {
// this would fail at runtime as e.g DTuple("Tag") would enter this case (the `DTuple["BuildTime", DMapping]` is unchecked at runtime
// case d: DTuple["BuildTime", DMapping] => d.second.format(ISO_ZONED_DATE_TIME)

// this doesn't compile because `d.second`'s type is still 'DMapping[(d.first : DKey)]', not 'DMapping["BuildTime"]'
// case d@DTuple("BuildTime") => d.second.format(ISO_ZONED_DATE_TIME)

case d@DTuple("Tag"): DTuple["Tag", DMapping] => d.second
case d@DTuple("Versions"): DTuple["Versions", DMapping] => d.second.mkString(", ")
case d@DTuple("Author"): DTuple["Author", DMapping] => d.second.toString
case d@DTuple("BuildTime"): DTuple["BuildTime", DMapping] => d.second.format(ISO_ZONED_DATE_TIME)
}

object Main extends App {
List(
DTuple[DKey, DMapping]("Versions")(Array("1.0", "2.0")),
DTuple[DKey, DMapping]("Tag")("env=SO"),
DTuple[DKey, DMapping]("Author")("MK"),
DTuple[DKey, DMapping]("BuildTime")(ZonedDateTime.now())
).foreach { dt =>
println(mkString(dt))
}
}

打印

1.0, 2.0
env=SO
MK
2020-10-23T21:04:06.696+02:00[Europe/Paris]

关于scala - Scala 3/Dotty 中的依赖元组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64490065/

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