【发布时间】:2015-08-04 20:48:20
【问题描述】:
据我所知,这段代码 sn-p 应该可以毫无问题地编译:
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 抱怨 lst 表达式中的 num 不是 Int。但是digits的类型是
digits :: Integral n => n -> n -> [n]
它不需要Int 作为参数,只需要一个整数,numToBaseN 的类型签名也是如此。
!! 需要一个 Int,这就是它使用 fromIntegral 转换的原因。
这是怎么回事?
如果我将num 替换为(fromIntegral num),它会编译,但是我失去了转换整数(即任意大整数)的能力。
【问题讨论】: