Использование списочных представлений для удаления элемента списка по индексу - PullRequest
0 голосов
/ 27 сентября 2011

Таблица представляет собой список списков, где данные настроены следующим образом:

data Position = CEO | Manager| Programmer | Intern deriving (Eq, Show)

data Field = EmployeeID Int | T Position | Name String | Salary Int deriving (Eq)

instance Show Field where
    show (EmployeeID k) = show k
    show (T p) = show p
    show (Name s) = s
    show (Salary k) = show k

type Column = Int
type Row = [Field]
type Table = [Row]

Пример таблицы будет выглядеть следующим образом:

employees = [[EmployeeID 1, Name "Shoo"],
    [EmployeeID 2, Name "Barney"],
    [EmployeeID 3, Name "Brown"],
    [EmployeeID 4, Name "Gold"],
    [EmployeeID 5, Name "Sky"]]

Как мне поступитьоб использовании понимания списка для создания функции, которая удаляет столбец из таблицы?Я не знаю, как работать со списками списков.Мне нужно иметь функцию типа delete :: Column -> Row -> Row

Ответы [ 3 ]

1 голос
/ 27 сентября 2011

Понимание списка не очень хорошо подходит для удаления по индексу, но вот попытка (с учетом домашней работы):

deleteAt :: Column -> Row -> Row
deleteAt n r = [e|(i,e) <- zip (a list of all indexes) r, test i] where
  test i = (True if index i should be kept and False otherwise)

Если вы хотите создать понимание списков, которое работает со списками списков, вы можете просто вложить их:

operate :: Table -> Table
operate t = [[myFunction field|field <- row, myPredicate field]| row <- t]

myFunction :: Field -> Field
myPredicate :: Field -> Bool
1 голос
/ 27 сентября 2011

Если бы я реализовал это без понимания списка, я бы использовал map и filter .

К счастью, вы легко можете сделать обате, у которых есть списки .

Я собираюсь избегать использования вашего кода, но в качестве примера предположим, что у меня был список списков:

nameSets = [[ "dave", "john", "steve"]
           ,[ "mary", "beth", "joan" ]
           ,[ "daren", "edward" ]
           ,[ "riley"]
           ]

И я хотелполучить возбужденные версии всех списков с тремя элементами:

[ [ name ++ "!" | name <- nameSet ] | nameSet <- nameSets, length nameSet == 3 ]
-- [[ "dave!", "john!", "steve!"]
-- ,[ "mary!", "beth!", "joan!" ]
-- ]

Редактировать : только что заметил, что ваш столбец указан по индексу.В этом случае полезен zip , который также может быть выполнен со списками, но требуется расширение языка.

В исходном файле поставьте {-# LANGUAGE ParallelListComp #-} в верхней части, чтобыделать молнии в списках.

Вот как они работают:

% ghci -XParallelListComp
ghci> [ (x,y) | x <- "abcdef" | y <- [0..5] ]
[('a',0),('b',1),('c',2),('d',3),('e',4),('f',5)]

Или без расширения

% ghci
ghci> [ (x,y) | (x,y) <- zip "abcdef" [0..5] ]
[('a',0),('b',1),('c',2),('d',3),('e',4),('f',5)]
0 голосов
/ 27 сентября 2011

Хм, это не ответ, так как вы просили использовать списочные выражения. Но я думаю, что списочные представления совершенно не подходят для этой задачи. Вам нужны только take и drop.

ghci> take 2 [1,2,3,4,5]
[1,2]
ghci> drop 2 [1,2,3,4,5]
[3,4,5]

Чтобы удалить элемент с индексом i , добавьте вместе первые элементы i и список с первыми пропущенными элементами i + 1 .

...