gpt4 book ai didi

scala - 类型类 : maintain value at type level

转载 作者:行者123 更新时间:2023-12-02 01:07:36 26 4
gpt4 key购买 nike

我想创建一个 Int 值的类型级别表示,存储如下:

sealed trait Position {
def value : Int
}

class P1 extends Position {val value = 1}
class P2 extends Position {val value = 2}

当一个类扩展它时:

case class PExtended() extends P1

我想在类型级别检索值:

def getValue[A <: Position] = ???
getValue[PExtended] //should return 1

我尝试了一些方法,但不确定这是否是解决此问题的最佳方法。任何关于如何开始的建议都会很棒。

最佳答案

需要实现一个类型类,使用Shapeless Nat numbers来解决问题:

import shapeless.ops.nat.ToInt

import shapeless.Nat
import shapeless.ops.nat.ToInt

trait Number[A] {
def number: Int
}

object Number {

def apply[A](implicit number: Number[A]): Number[A] = number
implicit def positionNumber[A, N <: Nat](implicit eq: A <:< Position[N], toInt: ToInt[N]): Number[A] = {
new Number[A] {
override def number: Int = toInt.apply()
}
}
}

然后你就可以用它来实现你的方法了

sealed trait Position[T <: Nat]

class P1 extends Position[Nat._1]
class P2 extends Position[Nat._2]

object Test extends App {
case class PExtended() extends P1

def getValue[A](implicit number: Number[A]): Int = {
number.number
}

println(getValue[PExtended])
}

关于scala - 类型类 : maintain value at type level,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46868912/

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