微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

咖喱类型“不带类型参数”

如何解决咖喱类型“不带类型参数”

我想创建一个可以用来验证元组是否同质的类型。我写了这个,应该确保T的所有元素都等于XScastie):

type Homogenous[X] = [T <: Tuple] =>> T match {
  case EmptyTuple => DummyImplicit
  case X *: t => Homogenous[X][t] //Doesn't work
  case _ => nothing
}

def f[T <: Tuple : Homogenous[String]](t: T) = ???

无论出于何种原因,第三行都不会编译,并显示以下错误

均质[X]不使用类型参数

但是,如果我使Homogenous接受2个参数,它将编译,但我不能再使用上下文绑定(Scastie)。

type Homogenous[X,T <: Tuple] = T match {
  case EmptyTuple => DummyImplicit
  case X *: t => Homogenous[X,t]
  case _ => nothing
}

我不明白为什么会这样。似乎lambda [T] =>>只是从匹配类型的特定情况下返回而已,因此编译器应意识到Homogenous[X]始终采用参数。这是错误还是我做错了什么?是否有修复程序/解决方法

解决方法

看起来像是错误或未充分使用的功能。

作为解决方法,请尝试

trait Hom[X] {
  type Rec[T <: Tuple] = T match {
    case EmptyTuple => DummyImplicit
    case X *: t => Rec[t] 
    case _ => Nothing
  }
}

type Homogenous[X] = [T <: Tuple] =>> Hom[X]#Rec[T]

也许与

有关

doc

https://contributors.scala-lang.org/t/multiple-type-parameter-lists-in-dotty-si-4719

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。