Funktioniert eine Int => Option[Nat]
Funktion in Shapeless?Int => Option [Nat]?
Seine Art Signatur:
intToOptionNat(a: Int): Option[Nat] = ???
Beispiele:
intToOptionNat(5) == Some(Nat(5))
intToOptionNat(-42) == None
Funktioniert eine Int => Option[Nat]
Funktion in Shapeless?Int => Option [Nat]?
Seine Art Signatur:
intToOptionNat(a: Int): Option[Nat] = ???
Beispiele:
intToOptionNat(5) == Some(Nat(5))
intToOptionNat(-42) == None
Ich denke, dass für das, was Sie suchen, ist eine Funktion, die eine Int
an den entsprechenden Nat
Subtyp konvertiert, das wird etwas von der Form _0
, Succ[_0]
, Succ[Succ[_0]]
usw.
Da wir normalerweise die Struktur des resultierenden Subtyps Nat
in einer späteren Typ-Level-Berechnung ausnutzen wollen, ist dies etwas, das zur Kompilierungszeit statisch bekannt sein muss. Folglich ist der Typ Int
nicht ausreichend präzise ... wir brauchen stattdessen einen Singleton-Typ Int
. Diese sind nicht (yet) direkt ausdrückbar in Scala, bietet jedoch formlos eine Makro-basierte implizite Konvertierung zur Berechnung ein Nat
von einer Int
wörtlichen,
scala> import shapeless.syntax.nat._
import shapeless.syntax.nat._
scala> def intToNat(n: Nat): n.type = n
intToNat: (n: shapeless.Nat)n.type
Da diese berechnet statisch gibt es keine Notwendigkeit für das Ergebnis Typ sein in Option
gewickelt ... wenn das Argument wörtliche hat eine Nat
Darstellung nicht haben wird es eine Kompilierung Fehler sein,
scala> intToNat(5)
res0: Succ[Succ[Succ[Succ[Succ[_0]]]]] = Succ()
scala> intToNat(-42)
<console>:19: error: Expression -42 does not evaluate to a non-negative Int literal
intToNat(-42)
^
Danke für die Beantwortung. Letztendlich versuche ich einen JSON-Reader (JSON -> A) für ein Nat zu erstellen. Also, wie ich es verstehe, muss ich dynamisch ein Nat aufbauen - daher der Rückgabetyp Option [Nat]. –
Wie @travisbrown in einem Kommentar zu Ihrer Frage bemerkt hat, ist der Typ 'Option [Nat]' für Sie nicht von Nutzen. Ich schlage vor, Sie versuchen, Ihr Problem anders zu gestalten. –
nicht zu 100% auf diese; Diese Funktion existiert nicht formlos. Sie können Nat.apply verwenden, um eine Funktion zu erstellen, die dies tut. –
'Nat' ist ein ziemlich nutzloser Typ, und wenn Sie nur nach Gleichheit suchen wollen, gehen Sie besser in die andere Richtung. Etwas wie 'foo [N <: Nat] (a: Int): Option [N]' könnte etwas nützlicher sein, und von meinem Kopf weiß ich nicht, ob das in Shapeless existiert. –
Nun, ich hatte vor, die Antwort dieser Frage in http://stackoverflow.com/questions/39156628/enforce-bounded-nat zu verwenden. Nehmen wir an, ich habe 'Case-Klasse X (n: N)', wobei 'N' ein' Nat' ist, ausschließlich zwischen 0 und 5. –