2013-03-17 12 views
6

1) Jak przekonwertować z jednego typu Int na typ Num?Konwersja typu Int

Podobne pytania zadawano wcześniej, a odpowiedź brzmi (tak jak na wiki Haskella) jest użycie fromIntegral. fromIntegral zwraca typ Num, więc muszę go przesłać do żądanego formatu.

muszę wziąć Word16 i przekształcić go w Int64 tak robie następujące

let valueLength = (fromIntegral(tagLength) :: Int64) 

gdzie tagLength ma typ Word16

Czy tego podejścia są prawidłowe?

2) W jaki sposób można bezpiecznie obsługiwać konwersję typu?

Jadąc od tła Java, gdzie jest dla liczb całkowitych wierzę Short, Int i Long mogę użyć short jako int ale nie na odwrót. W Haskell choć jeśli piszę

256 :: Word8 

w ghci zwraca 0.

Odpowiedz

20

muszę wziąć Word16 i przekształcić go w Int64 więc robię, co następuje:

let valueLength = (fromIntegral(tagLength) :: Int64) 

Czy to podejście jest prawidłowe?

Zapytajmy GHC!

Prelude Data.Word Data.Int> :t fromIntegral :: Word16 -> Int64 
fromIntegral :: Word16 -> Int64 :: Word16 -> Int64 

Wygląda dobrze.

W jaki sposób obchodzić się z typem konwersji bezpiecznie?

Haskell nie ma konwersji typu. W ogóle. Wszystkie "konwersje" muszą zostać wykonane poprzez napisanie funkcji, która "konwertuje" z jednego rodzaju na inny.

Jeśli piszę 256 :: Word8 w ghci zwraca 0.

Literały liczbowe są polimorficzne. Do rzeczy bez punktu dziesiętnego, fromInteger jest używany domyślnie:

Prelude> :t 256 
256 :: Num a => a 
Prelude> :t fromInteger 
fromInteger :: Num a => Integer -> a 
Prelude> fromInteger (256 :: Integer) :: Word8 
0 

To może być miło, gdyby nie było to ostrzeżenie czy coś dla literałów liczbowych z typem jednokształtnym które były poza zasięgiem dla tego typu; być może powinieneś złożyć wniosek o funkcję na GHC's bug tracker.