gpt4 book ai didi

scala - 异构映射,编译时的依赖类型

转载 作者:行者123 更新时间:2023-12-01 11:38:40 27 4
gpt4 key购买 nike

尝试使用 this Miles Sabin 的技巧,创建一个只接受一组预定义 types 参数的函数.

val bool =  Boolean
val timestamp = new Timestamp(date.getTime())
val str = "My String"

然后下面应该在编译时通过

takeValue(bool)
takeValue(timestamp)
takeValue(str)

但是

哪里takeValue应该因 takeValue(someIntValue) 而失败如果implicit对于 type Int未定义。此失败将发生在编译时。

trait MyConv[K] { type V; def convert: AnyRef => V }

def iMakeConv[V0](con: AnyRef => V0) = new MyConv[con.type] {
override type V = V0
val convert = con
}

def takeValue(value:AnyRef)(implicit conv :MyConv[value.type]) : \/[Throwable,conv.V] = \/.fromTryCatch(conv.convert(value))

然后

implicit val strAny = iMakeConv((x:Any) => x.toString)

然后我想要takeValue(str)在编译时工作但是takeValue(someIntValue)在编译时失败,因为没有任何合适的 implicit为其定义。基本上想限制(在编译时)types 的类型takeValue可以为他人接受和失败。

当然我在这里做错了,因为在调用时

takeValue("string")

它在编译时抛出以下内容

 could not find implicit value for parameter conv: 
MyConv[String("string")]
- not enough arguments for method takeValue: (implicit conv:
MyConv[String("string")])scalaz.\/[Throwable,conv.V].
Unspecified value parameter conv.

最佳答案

.type 的含义经常被误解。 value.type 类型是只有一个值的类型 - value。即使已知 valueStringvalue.type 也不是 String,而是只有一个 >字符串 -

因此,代码试图找到一个 MyConv[value.type],但其中不存在,即使有可用的 MyConv[String]

takeValue改用类型参数:

def takeValue[T](value: T)(implicit conv: MyConv[T]) : \/[Throwable, conv.V] = \/.fromTryCatch(conv.convert(value))

或者使 MyConv 的类型参数逆变:

trait MyConv[-K] { type V; def convert: AnyRef => V }

如果 value.typeT 的子类型,这将允许使用 MyConv[T]

您还需要一个不同的 MyConviMakeConv:

trait MyConv[K] { type V; def convert: K => V }

def iMakeConv[K, V0](con: K => V0) = new MyConv[K] {
override type V = V0
val convert = con
}

关于scala - 异构映射,编译时的依赖类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24444046/

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