Haskell ASCII codes

3
我正在尝试创建一个函数,它接受一个a(可以是任何类型:int、char等),并创建一个列表,其中该输入被复制相应次数的ASCII码。
我已经创建了这个函数:

toList n = replicate (fromEnum n) n

当尝试在cmd中使用该函数时,它说它无法将期望的类型int与char匹配。然而,如果我直接在cmd中使用我的函数,使用实际值,它会按照预期工作。
我的意思是:toList 'a' --> 给我一个错误
replicate (fromEnum 'a') 'a' --> 没有问题地给出结果
我已经加载了模块Data.Char(ord)
如何解决这个问题,为什么会发生这种情况?
提前感谢您的帮助 :)
1个回答

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 实例的类型才能使用。

哦,我明白了!那是因为只有可枚举类型才有ASCII码?(对不起,我是新手) - BVCGAAV
我不明白为什么 GHC 不能推断出那个类型? - Ingo
@Ingo,嗯,你是正确的,GHC可以推断类型。我的第一个假设(没有运行任何代码)是缺少类型签名会导致错误,但当我将ipg24的代码复制到文件中并运行时,我没有得到错误。 - bheklilr
它只是说“无法将预期的Int类型与Char匹配”。但是,如果我在文件中加入toList ::(Enum a)=> a-> [a],它就可以完美地工作了。 - BVCGAAV
@bheklilr 好的,我不知道怎么回事,但是我从文件中删除了规范(现在与之前相同),突然一切都正常了,没有错误!我不知道为什么,但它确实发生了。这次我没有导入 Data.Char(ord),可能是因为这个原因吗? - BVCGAAV
显示剩余6条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接