【发布时间】:2015-03-04 23:39:54
【问题描述】:
我正在查看tutorial in School of Haskell,当时一段特定的代码让我感到困惑。在我看来,下面的 sn-p 应该不起作用,但它确实有效。在这种情况下,对readMay的评估有些地方我不太明白。
import Safe (readMay)
main = do
putStrLn "Please enter your birth year"
yearString <- getLine
case readMay yearString of
Nothing -> putStrLn "Invalid year"
Just year -> putStrLn $ "In 2020, you'll be " ++ show (2020 - year)
不应该readMay yearString (:t readMay = Read a => String -> Maybe a) 总是评估为Nothing,因为我没有强制它的类型?要使此代码正常工作,必须首先计算 case 语句的结果表达式,因为表达式 2020 - year 将要求 year 属于 Num 类型类,因此允许 readMay yearString 计算为Just year.
【问题讨论】:
-
很好的例子。一开始,类型推断可能非常聪明。
-
其实这里要使用的类型是模棱两可的。它仅因 GHC “魔法”而起作用 - 它默认类型为
readMay :: String -> Maybe Integer。如果你打开警告,你会看到这个。 -
@user2407038 我想知道...我认为它一定是默认规则。