我正在查看 tutorial in School of Haskell ,当一段特定的代码让我感到困惑时。在我看来,下面的代码段不应该起作用,但确实可以。在这种情况下,我不太了解 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

最佳答案

Haskell 在编译时决定类型应该是什么。它要么确定 readMay 的返回类型应该是什么,要么由于类型错误而拒绝编译代码。

到代码运行时,Haskell 已经“知道” readMay 应该返回什么类型。如果实际显示的字符串无法解析,您将得到 Nothing

简而言之,这与惰性求值无关。这是关于编译时与运行时。 [如果你只是从 GHCi 运行它,这可能不是那么明显。]

关于Haskell:如何评估 readMay?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/28856308/

10-10 13:30