web-dev-qa-db-fra.com

Haskell Convert Integer to Int?

Est-il possible de lancer un Integer sur un Int? L'autre direction est possible: toInteger. Je sais qu'Integer est capable de stocker de plus grandes valeurs, mais parfois une conversation est nécessaire pour utiliser les fonctions std-lib. J'ai essayé (n :: Int) et d'autres exemples de code que j'ai trouvés - mais rien ne fonctionne.

takeN :: Integer -> [a] -> [a]
takeN n l = take n l
38
NaN

Utilisez fromIntegral.

takeN :: Integer -> [a] -> [a]
takeN n l = take (fromIntegral n) l

Notez que fromIntegral :: (Integral a, Num b) => a -> b, donc parfois vous aurez besoin d'une annotation de type supplémentaire (par exemple (fromIntegral n :: Int)), Mais généralement le compilateur peut déduire quel type vous voulez.

Dans le cas particulier de votre exemple, dans Data.List Il y a genericTake :: (Integral i) => i -> [a] -> [a], qui fait la même chose que take mais avec un type plus général.

47
dave4420

il y a aussi fromInteger (fromIntegral est juste fromInteger . toInteger, mais comme vous avez un Integer de toute façon, vous pouvez sauter la deuxième partie)

17
newacct