(缺少)在Haskell中使用Read和Show时的模糊类型

Tan*_*aki 4 haskell types functional-programming ambiguous-call

我写了一个非常简单的Haskell程序:

main = print $ sum $ map read ["55", "99", "101"]
Run Code Online (Sandbox Code Playgroud)

根据我过去的经验,我预计会出现"模糊类型"错误,因为签名sum $ map read [...](Read a, Num a) => a; Num是一个类,因此不能自己实现Show类.但是,程序正确输出"255".如何print确定产生输出的方法?(show也能够产生正确的结果,没有错误.)

Eri*_*ikR 7

如果你使用该-fwarn-type-defaults选项,你会得到这个:

$ ghc -O2 -fwarn-type-defaults ddd.hs
[1 of 1] Compiling Main             ( ddd.hs, ddd.o )

ddd.hs:2:8: Warning:
    Defaulting the following constraint(s) to type ‘Integer’
      (Show s0) arising from a use of ‘print’ at ddd.hs:2:8-12
      (Read s0) arising from a use of ‘read’ at ddd.hs:2:26-29
      (Num s0) arising from a use of ‘sum’ at ddd.hs:2:16-18
    In the expression: print
    In the expression: print $ sum $ map read ["55", "99", "101"]
    In an equation for ‘main’:
        main = print $ sum $ map read ["55", "99", "101"]
Run Code Online (Sandbox Code Playgroud)

这解释了发生了什么.