2011-11-01 18 views
28

È possibile eseguire il cast di un intero su un Int? L'altra direzione è possibile: a Intero. So che Integer è in grado di memorizzare valori più grandi, ma a volte è necessaria una conversazione per usare le funzioni std-lib. Ho provato (n :: Int) e altri esempi di codice che ho trovato - ma niente funziona.Haskell Converti intero in Int?

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

risposta

33

Usa fromIntegral.

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

noti che fromIntegral :: (Integral a, Num b) => a -> b, in modo a volte avrete bisogno di un tipo di annotazione in più (per esempio (fromIntegral n :: Int)), ma di solito il compilatore può dedurre quale tipo si desidera.

Nel caso speciale del tuo esempio, in Data.List c'è genericTake :: (Integral i) => i -> [a] -> [a], che fa la stessa cosa di take ma con un tipo più generale.

13

c'è anche fromInteger (fromIntegral è solo fromInteger . toInteger, ma dal momento che si dispone di un Integer in ogni caso in modo da poter saltare la seconda parte)