p.s:我不确定如何命名我的问题,可以随意告诉我该如何命名。
如果未指定具体类型,则会出现此错误,该错误非常清楚且易于解决:
使用
a0
引起的歧义类型变量fct
阻止约束(Read a0)
被解决。 可能的解决办法:使用类型注释来指定a0
应该是什么。
我只需要更多解释为什么有效? Read
将如何知道返回的类型是
fct :: (Show a, Read b) => a -> b
fct = read . show
main = do
-- DOES NOT WORK: -- print (fct 4)
-- WORKS: -- print (fct 4 :: Int)
答案 0 :(得分:6)
(fct 4 :: Int)
的意思是(fct 4) :: Int
,而不是fct (4 :: Int)
。前者指定fct
的结果必须为Int
,因此必须使用read
将字符串转换为Int
。
相反,文字4
不受限制。这会触发所谓的默认规则,默认规则将其类型选择为Integer
。当数字文字不明确时,会发生这种默认情况。引入默认设置是为了使print 4
之类的代码无需注释即可工作-为程序员的方便提供了一个小的“特殊情况”。
结论:调用show
将4 :: Integer
转换为字符串"4"
,然后将其读回到4 :: Int
。