据我所知,这段代码片段应该编译没有问题:
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
Run Code Online (Sandbox Code Playgroud)
但是GHC抱怨说,num在lst表达不是Int.但是类型digits是
digits :: Integral n => n -> n -> [n]
Run Code Online (Sandbox Code Playgroud)
它不需要Int作为参数,只需要一个Integral,类型签名也是numToBaseN如此.
!!需要一个Int,这就是使用它进行转换的原因fromIntegral.
这里发生了什么?
它编译,如果我取代num用(fromIntegral num),但后来我失去了转换一个整数(即任意大的整数)的能力.
sep*_*p2k 12
两个参数都digits需要具有相同的类型并且length charlst具有类型Int,因此num还必须具有类型Int.
如果我将num替换为(fromIntegral num),它会编译,但后来我失去了转换整数的能力
如果你申请fromIntegral到length charlst,相反,它会把它转换成哪种办法num是,所以它会工作,你想要的方式.