Функция для преобразования Hex в Oct в haskell

#haskell #hex #octal

#haskell #шестнадцатеричный #восьмеричный

Вопрос:

Я должен преобразовать любое шестнадцатеричное число в Oct-число. В другом сообщении я видел этот код

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

для Oct в Hex, но я не понимаю эту readOct функцию..

Кто-нибудь может мне это объяснить или помочь мне иначе?

Заранее спасибо 🙂

Комментарии:

1. readOct это просто простая функция, это функция, которая на самом деле выполняет работу, все остальное — это ввод данных для чтения и вывода на печать. Таким образом, файл содержит / импортирует где-то еще readOct функцию.

2. Должен ли я просто добавить readOct = "0644" , например, в первой строке этого кода, а затем программа преобразует это число в шестнадцатеричное число?

3. нет, readOct это функция , которая принимает строку и возвращает a Integer . Но, тем не менее, фрагмент кода на самом деле не является функциональным программированием. Это больше похоже на человека, преобразующего императивную программу в Haskell.

4. Честно говоря, я тоже не очень понимаю readOct , исходя из его использования. Вместо чего-то простого, похоже String -> Integer , что тип относится String -> [(Integer, ?)] к какому-то неизвестному типу ? .

Ответ №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 , чтобы обеспечить эффективную цепочку.