为什么将具体类型传递给函数可以解决错误?

时间:2018-08-21 16:39:32

标签: haskell types syntax polymorphism typeclass

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)

1 个答案:

答案 0 :(得分:6)

(fct 4 :: Int)的意思是(fct 4) :: Int,而不是fct (4 :: Int)。前者指定fct的结果必须为Int,因此必须使用read将字符串转换为Int

相反,文字4不受限制。这会触发所谓的默认规则,默认规则将其类型选择为Integer。当数字文字不明确时,会发生这种默认情况。引入默认设置是为了使print 4之类的代码无需注释即可工作-为程序员的方便提供了一个小的“特殊情况”。

结论:调用show4 :: Integer转换为字符串"4",然后将其读回到4 :: Int