我必须将任何十六进制数转换为十进制数。在另一个帖子上,我看到了这个代码
main = do
octStr <- getLine
let
val :: Integer
(val,_):_ = readOct octStr
hexStr = showHex val ""
putStrLn hexStr
对于Oct到Hex,但我不理解readOct
函数。。
有人能向我解释或帮助我吗?
提前感谢:(
readOct
有一个奇怪的类型,因为它意味着要与其他ReadS
解析器有效地链接。这里有一个助手函数,可以使类似函数的使用变得简单:
runReadS :: ReadS a -> String -> Maybe a
runReadS f s = case f s of
[(x, "")] -> Just x
_ -> Nothing
如果只有一个有效的解析,并且它使用了整个输入,那么该函数将返回解析结果Just
。否则(如果根本没有解析,如果有多个不明确的解析,或者如果字符串中还有未解析的位(,它将返回Nothing
。然后,您可以在代码中以更简单的方式使用该函数,如下所示:
import Numeric
main = do
octStr <- getLine
case runReadS readOct octStr of
Nothing -> putStrLn $ octStr ++ " is not valid octal!"
Just val -> putStrLn $ octStr ++ " in octal is " ++ showHex val " in hexadecimal."
showHex
函数看起来也很奇怪。它不是返回一些字符串str
,而是有效地返回str ++
,以实现高效的链接。