dire que j'ai un prototype de fonction comme suit:
func :: [Int] -> [Int]
5 Réponses :
Avez-vous essayé http://hackage.hakell.org/package/non-negative < / a>? p>
J'espère que quelqu'un montrerait comment faire cela avec des types, mais je peux maintenant voir que cela est impossible - du commentaire de la classe de type non négatif.cès dans Non négatif: "Les instances de cette classe doivent garantir des valeurs non négatives. Nous ne pouvons pas appliquer cela par des types, mais la contrainte de classe de type nonNEgative.ce évite l'utilisation accidentelle des types qui permettent des nombres négatifs. " Quelle déception :-)
Vous pouvez utiliser Numéros de ponte , modifiant le type de votre fonction sur ou vous pouvez ajouter une vérification d'exécution: P> [ PEANO] -> ... code>. Mais vous devrez ensuite ajouter des fonctions de conversion des entiers vers des numéros de PEANO et de retour lorsque vous appelez votre fonction.
func xs
| any (< 0) xs = error "only non-negative integers allowed as input"
| otherwise = ...
newtype NonNegative a = NonNegative a toNonNegative :: (Num a, Ord a) => a -> NonNegative a toNonNegative x | x < 0 = error "Only non-negative values are allowed." | otherwise = NonNegative x fromNonNegative :: NonNegative a -> a fromNonNegative (NonNegative x) = x Just be careful to never use the NonNegative constructor directly. This will be easier if you put this in a separate module and don't export it.Also, now you can use (map toNonNegative) to lazily transform a list of numbers.This will still require a runtime check wherever you inject raw numbers.Alternatively, you can use Data.Word.
dans le paquet de base avec la version> = 4.8.0.0, qui est incluse dans GHC 7.10.1 et plus, il existe maintenant un type Natural qui fait ce que vous voulez - vous pouvez simplement modifier votre code en:
GHCi, version 8.0.2: http://www.haskell.org/ghc/ :? for help Prelude> :m +Data.Word Prelude Data.Word> 2 :: Word 2 Prelude Data.Word> it - 4 18446744073709551614
Il peut sembler un peu étrange de marquer une question comme une duplication d'une question nouvelle i>. Mais je pense que c'est logique, car les réponses à la duplication marquée couvrent une gamme d'options plus large et sont expliquées de manière plus soignée.