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

run*_*eks 5 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
Run Code Online (Sandbox Code Playgroud)

但是GHC抱怨说,numlst表达不是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),它会编译,但后来我失去了转换整数的能力

如果你申请fromIntegrallength charlst,相反,它会把它转换成哪种办法num是,所以它会工作,你想要的方式.

  • `genericLength`也是一个选项,但不常用,可能是因为它需要另一个导入行. (6认同)