En jouant avec shapeless nombres naturels dans l'excitation, je me demande quelle pourrait être la meilleure approche pour obtenir la valeur entière de par exemple. un produit de nats.Int valeur de Prod in shapeless
Extrait de shapeless nat.scala
:
trait Prod[A <: Nat, B <: Nat] {
type Out <: Nat
}
trait ProdAux[A <: Nat, B <: Nat, C <: Nat]
object Prod {
implicit def prod[A <: Nat, B <: Nat, C <: Nat](implicit diff : ProdAux[A, B, C]) = new Prod[A, B] {
type Out = C
}
}
object ProdAux {
import Nat._0
implicit def prod1[B <: Nat] = new ProdAux[_0, B, _0] {}
implicit def prod2[A <: Nat, B <: Nat, C <: Nat, D <: Nat]
(implicit ev1 : ProdAux[A, B, C], ev2 : SumAux[B, C, D]) = new ProdAux[Succ[A], B, D] {}
}
Je suis Jusqu'à présent, viens avec la définition simple de
def toInt[A <: Nat, B <: Nat, C <: Nat](p: Prod[A, B])
(implicit paux: ProdAux[A, B, C], iv: ToInt[C]): Int = iv()
En fait, cette approche nécessiterait des implémentations quelque peu redondantes du code équivalent pour par exemple des sommes, des diffs, des factorielles etc. Donc je préfère être en mesure d'utiliser la méthode "par défaut" toInt[A <: Nat]
.
Comment le feriez-vous? Et est-il possible d'utiliser les types internes (Prod#Out
, Sum#Out
, ...)?
Miles, merci beaucoup! En fait, j'ai bien compris la classe de type 'Prod' mais j'aurais dû le préciser plus clairement dans mon OP. Votre réponse est exactement ce que je cherchais! – fotNelton