#haskell
#haskell
Вопрос:
Прежде всего, извините за мой плохой английский. Я не родной и стараюсь изо всех сил 🙂
Теперь к проблеме: у меня есть список строк, и я хочу преобразовать их в список целых чисел. Проблема в том, что это не просто числа, в основном строка представляет собой список.
["[1,2,3,4,5,6,7,8]","[8,7,6,5,4,3,2,1]","[1,2,3,4,5,6,7,8]"]
Это результат, который я получаю из своего кода, который я опубликую ниже.
Есть какие-нибудь идеи, как я могу добиться, чтобы внутренний список чисел был списком целых чисел? Я пробовал около трех часов и не нашел решения.
Любая помощь приветствуется.
С уважением
get "/authors/:author" $ do
authorName <- param "author"
directories <- liftIO(listDirectory("data/" authorName))
liftIO(readFiles directories authorName)
html (T.pack (HtmlModule.h1 ("Author: " authorName)))
readFiles :: [String] -> String -> IO ()
readFiles x authorName = do
let y = addPrefix x authorName
content <- mapM readFile y
putStrLn (show content)
Result: ["[1,2,3,4,5,6,7,8]","[8,7,6,5,4,3,2,1]","[1,2,3,4,5,6,7,8]"]
Ответ №1:
Вы можете read
преобразовать строку в список целых чисел:
let nums = map read content :: [[Int]]
Комментарии:
1. Если бы я могла, я бы вышла за тебя замуж! Большое вам спасибо. Я попробовал этот подход аналогичным образом, но он не сработал. Ваше решение работает как заклинание. Большое вам спасибо!!
Ответ №2:
Вы можете использовать read :: Read a => String -> a
для преобразования строки в тип, который является членом класса Read
типов.
Поскольку Int
является членом Read
класса типов и [a]
является членом класса типов Read
, если a
является членом Read
класса типов, мы, таким образом, можем прочитать список Int
s:
Prelude> read "[1,2,3,4,5,6,7,8]" :: [Int]
[1,2,3,4,5,6,7,8]
Таким образом, мы можем преобразовать список String
s с помощью:
content <- mapM ((read :: String -> [Int]) . readFile) y
read
вызовет ошибку в случае String
, если невозможно преобразовать. Вы можете использовать readMaybe :: Read a => String -> Maybe a
, чтобы обернуть результат в a Just
в случае, если синтаксический анализ прошел успешно, и Nothing
в случае, если синтаксический анализ не удался.
Комментарии:
1. И вам того же. Большое вам спасибо за вашу помощь. Это очень ценится!
2. Чтобы получить значение «Возможно» в случае сбоя чтения, используйте
traverse
:traverse (readMaybe @[Int])
который имеет типTraversable t => t String -> Maybe (t [Int])
.@[Int]
является примером visible-XTypeApplications
. Я предпочитаю писать, скажемread @[Int] <$> content
,read <$> content :: [[Int]]