Изменить список строк на список целых чисел

#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]]