2014-10-25 3 views
4

Я написал очень простую программу на Haskell:(отсутствие) Неоднозначность Тип При использовании Read и Show в Haskell

main = print $ sum $ map read ["55", "99", "101"] 

Учитывая мой прошлый опыт, я ожидал, чтобы получить сообщение об ошибке «неоднозначный тип», так как подпись от sum $ map read [...] - (Read a, Num a) => a; Num является классом и, следовательно, сам не может реализовать класс Show. Однако программа корректно выводила «255». Как print удалось определить способ производства выходных данных? (show также способен производить правильный результат без ошибок.)

ответ

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"] 

, который объясняет, что происходит.