繁体   English   中英

解释一段Haskell代码

[英]Explain a piece of Haskell code

有人知道此代码的作用吗?我知道它可以验证给定的年份,但我并没有真正了解整个过程。

tempYear <- getLine
case reads tempYear :: [(Integer, String)] of
     [(n, "")] -> do let year = read tempYear :: Int

我猜这里有case reads ,可以处理getLine没有返回正确数字的情况。 reads返回可能答案的列表。 如果tempYear以一个非数字开头,则将返回空列表。 如果字符串中还有其他字母或类似的东西,那么直到该字母的数字将为n 但是,元组中的第二个值不是空字符串,而是字符串的未解析其余部分。

但是,我不知道他为什么要先读取Integer然后读取Int 如果两种类型相等,则n也将等于year

如果将无法传递给它的字符串传递给read会引发不可捕获的异常,因此,如果您想接受可能无法解析的字符串,则需要使用相关的reads函数。 reads具有一个比较棘手的接口:它不返回单个整数结果,而是返回可能的解析结果列表,每个解析结果都是与原始字符串的未解析其余部分一起解析的整数。

  • 如果解析失败,它将返回空列表
  • 如果将其传递给“ 10asd”,它将返回一个元素列表,其中解析的数字为10,剩余的为“ asd”
  • afaik,当解析整数时, reads永远不会返回结果超过一个的列表。

在您的情况下,他正在使用模式匹配来检查读取的返回值是否正好是单个元素的列表,并且该单个解析结果是否留有一个空余数(意味着解析成功后得到一个数字)。

但是,他将数字重新读为Int有点奇怪。 通常,您只需从读取结果中获取数字即可。 (如果您确实需要一个Int,只需告诉reads首先读取一个Int而不是Integer即可)

case reads tempYear :: [(Integer, String)] of
 [(n, "")] -> n

另外,使用读取的全部目的是避免未处理的异常,但是如果我们不涵盖该模式匹配中的所有情况,我们仍然会得到未处理的异常! 您仍然需要告诉解析失败的情况:

case reads tempYear :: [(Integer, String)] of
 [(n, "")] -> n
 _         -> 0  --return a default value?

如果没有合理的默认值,而您只想“返回null”,那么Haskel的方法是返回Maybe Integer而不是Integer

case reads tempYear :: [(Integer, String)] of
 [(n, "")] -> Just n
 _         -> Nothing

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM