Nicht negative ganze Zahlen

8

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.

    
oem 15.01.2010, 11:09
quelle

5 Antworten

7
%Vor%

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.

    
Dagititis 15.01.2010 23:19
quelle
4

Haben Sie Ссылка ausprobiert?

    
kennytm 15.01.2010 11:28
quelle
1

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.

    
Martijn 15.01.2010 14:36
quelle
1

Die Wiki-Seite auf intelligenten Konstruktoren kann Ihnen eine Idee geben.

    
Wei Hu 16.01.2010 04:59
quelle
0

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:

%Vor%

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:

%Vor%     
Robin Green 16.11.2017 22:34
quelle

Tags und Links