代码之家  ›  专栏  ›  技术社区  ›  runeks

GHC表示“数字”需要整数时需要整数

  •  5
  • runeks  · 技术社区  · 9 年前

    据我所见,这段代码应该编译起来没有问题:

    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]
    

    它不需要 国际 作为一个参数,只有一个整数 numToBaseN 也一样。

    !! 需要Int,这就是为什么使用 fromIntegral .

    这是怎么回事?

    如果我替换 号码 具有 (fromIntegral num) ,但随后我失去了转换整数(即任意大整数)的能力。

    1 回复  |  直到 9 年前
        1
  •  12
  •   sepp2k    9 年前

    的两个参数 digits 需要具有相同的类型和 length charlst 具有类型 Int 所以 num 还必须具有类型 国际 .

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

    如果你申请 fromIntegral 长度查尔斯特 相反,它会将其转换为任何类型 号码 是的,所以它会按照你想要的方式工作。