我正在尝试创建一个带 a 的函数(可以是任何类型:int,char ...)并创建一个包含该函数的列表输入复制了与其ASCII代码对应的次数。
我创造了这个:
toList n = replicate(fromEnum n)n
当尝试在cmd中使用该函数时,它表示它可以匹配期望的类型int与char,但是如果我直接在cmd中使用我的函数并且具有实际值它会执行它所假设的
我的意思是:toList'a' - >给我一个错误
复制(fromEnum'a')'a' - >给出一个没有问题的结果
我已加载模块Data.Char(ord)
我该如何解决这个问题?为什么会这样?
提前致谢:)
答案 0 :(得分:4)
您缺少的是类型声明。你说你希望它能够采用任何类型,但你真正想要的是toList
采取Enum
的实例。当你在GHCi中玩它时,它会让你let toList n = replicate (fromEnum n) n
,因为GHCi会自动选择一些看似有意义的默认值,但是在用GHC编译模块时,如果没有这种类型,它将无法工作宣言。你想要
toList :: (Enum a) => a -> [a]
toList n = replicate (fromEnum n) n
您必须在类型签名中包含(Enum a) =>
的原因是因为fromEnum
具有类型签名(Enum a) => a -> Int
。所以你看到它不只是采用任何类型,只有那些拥有Enum
实例的类型。