6

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

之前已经提出过类似的问题,答案是(就像在 Haskell wiki 上一样)是使用fromIntegral. fromIntegral返回一个Num类型,所以我必须将其转换为我想要的格式。

我需要采取 aWord16并将其转换为 aInt64所以我正在执行以下操作

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

哪里tagLength有类型Word16

这种方法正确吗?

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

来自我相信 Integers 的 Java 背景,我Short可以 使用 a作为 an但不能反过来。在 Haskell 虽然如果我写IntLongshortint

256 :: Word8

其中ghci返回 0。

4

1 回答 1

21

我需要使用 Word16 并将其转换为 Int64,因此我正在执行以下操作:

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

这种方法正确吗?

让我们问GHC!

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

看起来不错。

你如何安全地处理类型转换?

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

如果我写256 :: Word8ghci它返回0

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

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

如果单态类型的数字文字超出该类型的范围,可能会出现警告或其他内容;也许您应该在 GHC 的错误跟踪器上提交功能请求。

于 2013-03-17T14:13:29.133 回答