我正在查看 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/