haskell: преобразовать одного члена списка списков из char в int - PullRequest
0 голосов
/ 08 января 2012

Предположим, у меня есть такой список:

list= [["a","123","b"],["h","435","t"],["w","234","j"]]

Мне нужно преобразовать каждого второго члена этого списка списков в Integer, поскольку после этого он будет служить индикатором размера, чтобы я мог отсортировать свой список по размеру.

Я придумал функцию для преобразования:

charToInt c = ord (chr c)

но я не знаю, как преобразовать каждого второго члена списка.

Ответы [ 2 ]

6 голосов
/ 08 января 2012

Чтобы расширить сказанное Полом Джонсоном, вам нужно определить тип данных для данных, которые вы пытаетесь сохранить.

data MusicFile = MusicFile {music :: String,
                            size :: Integer,
                            artist :: String}
    deriving Show

musicFileFromStrings :: [String] -> MusicFile
musicFileFromStrings [sMusic, sSize, sArtist]
   = MusicFile sMusic (read sSize) sArtist

Тогда, если у вас есть

list = [["a","123","b"],["h","435","t"],["w","234","j"]]

, выможет сказать

anotherList = map musicFileFromStrings list

, а затем

map music anotherList   -- ["a", "h", "w"]
map artist anotherList  -- ["b", "t", "j"]

(РЕДАКТИРОВАТЬ)

Если вы хотите отсортировать список по определенному полю, вы можете использовать «sortBy» и « сравнение".

import Data.List
import Data.Ord

sizeOrderList = sortBy (comparing size) anotherList

Функция" сравнения "превращает функцию по значению (в данном случае" размер ") в функцию сравнения между двумя значениями.Единственное требование состоит в том, чтобы вывод «size» (в данном случае) был типом, который является экземпляром «Ord».

Если вы хотите убывать, используйте

sizeOrderList = sortBy (comparing (flip size)) anotherList
4 голосов
/ 08 января 2012

Вы не можете преобразовать второй элемент внутренних списков в Integer, не изменив тип из списка на что-то вроде кортежа. Причина в том, что списки в Haskell однородны, поэтому вам нужен кортеж для представления смешанных типов.

Преобразование String в Integer выполняется следующим образом:

read "123" :: Integer

Вам необходимо добавить тип напрямую, поскольку тип read равен Read a => String -> a, что означает, что он вернет что-то типа, который может быть «прочитан». К счастью, Integer является членом этого класса типов, поэтому мы можем преобразовать String в Integer.

Теперь просто преобразовать второй элемент каждого внутреннего списка:

convert :: [[String]] -> [(String, Integer, String)]
convert lists = map (\[a, b, c] -> (a, read b, c)) lists
...