Sprich ich habe einen Funktionsprototyp wie folgt:
%Vor%Wie ist es möglich, nur eine nicht negative Liste von ganzen Zahlen als Eingabeargumente zu erzwingen? Ich müsste den Param-Typ von [Int] in was ändern? In diesem schönen Moment funktioniert es mit func [-1, -2], ich will nur, dass es mit [1,2] arbeitet, d. H. Mit dem Interpreter, der die Fehlermeldung ausgibt.
Sei nur vorsichtig, niemals den NonNegative-Konstruktor direkt zu benutzen. Dies wird einfacher, wenn Sie dies in ein separates Modul einfügen und nicht exportieren.
Außerdem können Sie jetzt (map toNonNegative) verwenden, um eine Liste von Zahlen zu transformieren.
Dies erfordert immer noch eine Laufzeitprüfung, wo immer Sie rohe Zahlen injizieren.
Alternativ können Sie auch Data.Word verwenden.
Sie könnten Peano-Nummern verwenden, um den Typ Ihrer Funktion in [Peano] -> ...
zu ändern. Aber dann müssen Sie Konvertierungsfunktionen von ganzen Zahlen zu peano Zahlen und zurück hinzufügen, wenn Sie Ihre Funktion aufrufen.
Oder Sie könnten eine Laufzeitprüfung hinzufügen:
%Vor%Beachten Sie, dass die letztere Lösung Ihre Funktion strikt macht.
Die Wiki-Seite auf intelligenten Konstruktoren kann Ihnen eine Idee geben.
Im Basispaket mit der Version & gt; = 4.8.0.0, das in GHC 7.10.1 und höher enthalten ist, gibt es jetzt einen Typ Natürlich was das tut, was Sie wollen - Sie können Ihren Code einfach ändern zu:
%Vor% Es ist jedoch näher an Integer
als an Int
, denn wie Integer
und ungleich Int
hat es keinen maximalen Wert.
Da Natural
, wie Integer
, eine Instanz von Num
und Integral
ist, sind dieselben arithmetischen Operationen und Konvertierungsfunktionen verfügbar wie mit Integer
. Versuche, ein negatives Natural
zu berechnen, werden zur Laufzeit ein Underflow
ausgeben, was ein ArithException
ist. Außerdem können Sie bequem ein Natural
erstellen, indem Sie nur ein Ganzzahl-Literal ohne Konvertierung verwenden:
Wenn Sie jedoch lieber in der Domäne von Ganzzahlen mit fester Größe bleiben möchten, gibt es auch dafür eine Lösung - und es gibt sie schon viel länger - Word
von das Modul Data.Word (welches zB auch Word8
für nicht negative 8-Bit-Ganzzahlen enthält) . Sie würden Word
auf die gleiche Weise wie Natural
verwenden. Beachten Sie jedoch, dass die Word
-Typen automatisch unterlaufen, ohne eine Ausnahme auszulösen: