#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
это функция , которая принимает строку и возвращает aInteger
. Но, тем не менее, фрагмент кода на самом деле не является функциональным программированием. Это больше похоже на человека, преобразующего императивную программу в 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
, чтобы обеспечить эффективную цепочку.