2016-08-26 6 views
2

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 
+0

nicht zu 100% auf diese; Diese Funktion existiert nicht formlos. Sie können Nat.apply verwenden, um eine Funktion zu erstellen, die dies tut. –

+0

'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. –

+0

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. –

Antwort

1

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) 
       ^
+0

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]. –

+0

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. –