J'apprends Haskell pour le plaisir, en suivant Learn you a Haskell . La plage peut aller à l'infini avec des nombres lors de l'utilisation de [1..]
. Avec les caractères, où s'arrête la plage ['a'..]
? Je suppose un peu le dernier caractère de la table Unicode, mais je ne sais vraiment rien sur Haskell, alors demandez simplement!
Réponses
Trop de publicités?Si vous voulez savoir où la plage s'arrête, juste obtenir le dernier élément...
ghci> last ['a'.. ]
'\1114111'
Une autre méthode: Char
est bornée type, c'est à dire un type avec des valeurs minimales et maximales définies. Les Types de l' Bounded
classe fournit un maxBound
de la valeur. Depuis maxBound
est polymorphe, vous devez déclarer explicitement le type de la valeur que vous recherchez.
ghci> maxBound :: Char
'\1114111'
ghci> maxBound :: Int
9223372036854775807
Il n'y a pas d' maxBound
pour Integer
depuis qu'ils sont sans limite.
Le Haskell prélude explique le lien entre ['a'..]
et maxBound
. La notation ['a'..]
est sucre syntaxique pour enumFrom a
; ici, enumFrom
est une méthode de l' Enum
type de classe. La documentation de l' Enum
indique que lorsque le type est aussi une instance d' Bounded
, enumFrom x
doit être équivalent à enumFromTo x maxBound
, ou des plus lisible, [x..] = [x..maxBound]
. Ainsi, le dernier élément de l' ['a'..]
doit être le même que maxBound :: Char
.
last ['a'.. ]
ne itérer sur la liste, mais un ordinateur moderne peut compter jusqu'à un million de dollars en un clignement de paupières. Ce n'est pas quelque chose que vous voudriez mettre dans une boucle serrée, mais comme quelque chose que vous exécutez, juste une fois, il n'est pas un gros fardeau. Si vous essayez, au moins optimisée mise en œuvre comme les Câlins au lieu de GHC, vous devrez peut-être attendre le résultat. En revanche last [0..]
environ pour toujours.
À partir du Haskell Rapport de 2010:
Le caractère de type Char est une énumération dont les valeurs représentent Les caractères Unicode. Le Type Char est une instance des classes de la Lire, voir, Eq, Ord, Enum, et Délimitée.
Donc, en théorie, cette gamme devrait arrêter sur le dernier caractère défini dans la norme Unicode (si ce n'est pas indiqué quelle version). Dans la pratique, votre Haskell mise en œuvre peut varier, par exemple, GHCI 7.6.2 s'arrête à \1114111.