2013-03-17 5 views
6

1) Как вы конвертируете из одного Int типа в тип Num?Int type conversion

Аналогичные вопросы были заданы раньше, и ответ был (как и на Haskell wiki), чтобы использовать fromIntegral. fromIntegral возвращает тип Num, поэтому я должен указать его в желаемый формат.

мне нужно взять Word16 и преобразовать его в Int64 так, что я делаю следующее

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

где tagLength имеет тип Word16

ли такой подход правильным?

2) Как безопасно обрабатывать преобразование типов?

Исходя из фона Java, где есть для Целые я считаю Short, Int и Long я могу использовать short как int, но не наоборот. В Haskell, хотя, если я пишу

256 :: Word8 

в ghci она возвращает 0.

ответ

20

мне нужно взять Word16 и преобразовать его в Int64, так что я делаю следующее:

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

Правильно ли этот подход?

Давайте спросим GHC!

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

Выглядит хорошо.

Как вы относитесь к преобразованию типа безопасно?

Haskell не имеет тип преобразования. Вообще. Все «преобразования» должны выполняться путем записи функции, которая «преобразует» из одного типа в другой.

Если я пишу 256 :: Word8 в ghci возвращает 0.

Число литералов полиморфно. Для вещей с без десятичной точки, fromInteger используется неявно:

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

Было бы хорошо, если бы было предупреждение или что-то для числовых литералов с типом мономорфным, которые были вне диапазона для этого типа; возможно, вам следует подать запрос о функции на отслеживание ошибок GHC.