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

vin*_*ngo 1 syntax polymorphism haskell types typeclass

ps:我不知道如何命名我的问题,随意告诉我应该怎么命名.

如果没有指定具体类型,我会收到此错误,这个错误非常清晰且易于解决:

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)
Run Code Online (Sandbox Code Playgroud)

chi*_*chi 6

(fct 4 :: Int)意思是(fct 4) :: Int,不是fct (4 :: Int).前者指定的结果fct必须是Int,因此read,必须使用将一个字符串成Int.

相反,文字4是不受约束的.这会触发所谓的默认规则,该规则会Integer根据其类型进行选择.粗略地说,当数字文字不明确时,会发生这种违约.引入默认是为了让代码像print 4工作一样没有注释 - 这是程序员方便的一个小"特殊情况".

结论:show调用4 :: Integer变成字符串"4",然后读回4 :: Int.