9
votes

Entiers non négatifs

dire que j'ai un prototype de fonction comme suit:

func :: [Int] -> [Int]


1 commentaires

Il peut sembler un peu étrange de marquer une question comme une duplication d'une question nouvelle . 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.


5 Réponses :



1
votes

Vous pouvez utiliser Numéros de ponte , modifiant le type de votre fonction sur [ 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.

ou vous pouvez ajouter une vérification d'exécution: P>

func xs
  | any (< 0) xs  = error "only non-negative integers allowed as input"
  | otherwise     = ...


0 commentaires

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

0 commentaires

1
votes

La page wiki sur constructeurs intelligents peut vous donner une idée.


0 commentaires

0
votes

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


0 commentaires