据我所知,此代码段应该编译没有问题:
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)
,它就会编译,但是我失去了转换整数的能力(即任意大整数)。
答案 0 :(得分:12)
digits
的两个参数都需要具有相同的类型,而length charlst
的类型Int
类型,因此num
也必须具有Int
类型。
如果我将num替换为(fromIntegral num),它会编译,但后来我失去了转换整数的能力
如果您将fromIntegral
应用于length charlst
,它会将其转换为num
所属的类型,因此它会以您希望的方式运行。