【问题标题】:Function to convert Hex to Oct in haskell在haskell中将Hex转换为Oct的函数
【发布时间】:2020-11-28 12:33:20
【问题描述】:

我必须将任何十六进制数转换为十月数。 在另一篇文章中我看到了这段代码

main = do
    octStr <- getLine
    let
        val :: Integer
        (val,_):_ = readOct octStr
        hexStr = showHex val ""
    putStrLn hexStr

对于 Oct 到 Hex,但我不明白 readOct 函数..

谁能向我解释或以其他方式帮助我?

提前致谢:)

【问题讨论】:

  • readOct 只是一个简单的函数,这是真正工作的函数,剩下的就是更多的读取输入和打印输出。因此,该文件在其他地方包含/导入 readOct 函数。
  • 我是否只需要在该代码的第一行添加readOct = "0644" ,然后程序将该数字转换为十六进制数字?
  • 不,readOct 是一个函数,它接受一个字符串并返回一个Integer。但是,代码片段并不是真正的函数式编程。这看起来更像是将命令式程序转换为 Haskell 的人。
  • 公平地说,我也不太了解readOct,基于它的用法。而不是像String -&gt; Integer 这样简单的东西,对于某些未知类型?,类型似乎是String -&gt; [(Integer, ?)]

标签: haskell hex octal


【解决方案1】:

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 ++,以实现高效的链接。

【讨论】:

    猜你喜欢
    • 2021-01-31
    • 2022-01-20
    • 1970-01-01
    • 1970-01-01
    • 2013-12-23
    • 2013-12-23
    • 1970-01-01
    • 1970-01-01
    • 2013-12-31
    相关资源
    最近更新 更多