GHC说“数字”需要一个Int,当它需要一个积分时

时间:2015-08-04 20:48:20

标签: haskell ghc

据我所知,此代码段应该编译没有问题:

import Data.Digits (digits)
-- |convert integer to arbitrary base with specified charset
-- base/radix is charset string length.
-- eg. convert the integer 255 to hex:
--      intToBaseN 255 "0123456789abcdef" = "ff"
numToBaseN :: Integral n => n -> [Char] -> String
numToBaseN num charlst = map (\i -> charlst !! (fromIntegral i)) lst where
    lst = digits (length charlst) num

但GHC抱怨num表达式中的lst不是Int。但digits的类型是

digits :: Integral n => n -> n -> [n]

它不需要Int作为参数,只需要一个Integral,即numToBaseN的类型签名。

!!需要一个Int,这就是使用fromIntegral转换它的原因。

这里发生了什么?

如果我用num替换(fromIntegral num),它就会编译,但是我失去了转换整数的能力(即任意大整数)。

1 个答案:

答案 0 :(得分:12)

digits的两个参数都需要具有相同的类型,而length charlst的类型Int类型,因此num也必须具有Int类型。

  

如果我将num替换为(fromIntegral num),它会编译,但后来我失去了转换整数的能力

如果您将fromIntegral应用于length charlst,它会将其转换为num所属的类型,因此它会以您希望的方式运行。