2011-11-01 27 views
28

Czy można oddać Integer do Int? Drugi kierunek jest możliwy: toInteger. Wiem, że Integer jest w stanie przechowywać większe wartości, ale czasami potrzebna jest rozmowa do korzystania z funkcji std-lib. Próbowałem (n :: Int) i inne próbki kodu, które znalazłem - ale nic nie działa.Haskell Konwertuj Integer na Int?

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

Odpowiedz

33

Użyj fromIntegral.

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

Zauważ, że fromIntegral :: (Integral a, Num b) => a -> b, więc czasami trzeba będzie dodatkowy typ adnotacji (np (fromIntegral n :: Int)), ale zazwyczaj kompilator można wywnioskować, jaki rodzaj chcesz.

W szczególnym przypadku twojego przykładu, w Data.List znajduje się genericTake :: (Integral i) => i -> [a] -> [a], który robi to samo co take, ale z bardziej ogólnym typem.

13

istnieje również fromInteger (fromIntegral tylko fromInteger . toInteger, ale skoro masz Integer tak więc można pominąć drugą część)