Haskell 整型转换

Haskell 整型转换,haskell,types,type-conversion,Haskell,Types,Type Conversion,1) 如何从一种Int类型转换为Num类型 以前也有人问过类似的问题,答案是(在Haskell wiki上)使用from integralfromIntegral返回一个Num类型,因此我必须将其转换为所需的格式 我需要获取一个Word16并将其转换为Int64,因此我将执行以下操作 let valueLength = (fromIntegral(tagLength) :: Int64) 其中tagLength具有类型Word16 这种方法正确吗 2) 如何安全地处理类型转换 来自Java背景

1) 如何从一种
Int
类型转换为
Num
类型

以前也有人问过类似的问题,答案是(在Haskell wiki上)使用
from integral
fromIntegral
返回一个
Num
类型,因此我必须将其转换为所需的格式

我需要获取一个
Word16
并将其转换为
Int64
,因此我将执行以下操作

let valueLength = (fromIntegral(tagLength) :: Int64)
其中
tagLength
具有类型
Word16

这种方法正确吗

2) 如何安全地处理类型转换

来自Java背景,我相信整数有
Short
Int
Long
我可以将
short
用作
int
,但不能反过来使用。如果我写的话

256 :: Word8
ghci
中,它返回0

我需要将Word16转换为Int64,以便执行以下操作:

let valueLength = (fromIntegral(tagLength) :: Int64)
这种方法正确吗

让我们问问GHC

Prelude Data.Word Data.Int> :t fromIntegral :: Word16 -> Int64
fromIntegral :: Word16 -> Int64 :: Word16 -> Int64
看起来不错

如何安全地处理类型转换

Haskell没有类型转换。完全所有的“转换”都必须通过编写一个从一种类型“转换”到另一种类型的函数来完成

如果我在
ghci
中写入
256::Word8
,它将返回
0

数字文字是多态的。对于没有小数点的对象,隐式使用
fromInteger

Prelude> :t 256
256 :: Num a => a
Prelude> :t fromInteger
fromInteger :: Num a => Integer -> a
Prelude> fromInteger (256 :: Integer) :: Word8
0
如果对于单态类型的数值文本有一个警告或其他东西超出了该类型的范围,那就更好了;也许你应该在GHC的bug追踪器上提交一个特性请求