使用列表推导按索引删除列表元素

时间:2011-09-26 22:04:28

标签: haskell list-comprehension

表是列表列表,其中数据设置如下:

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 个答案:

答案 0 :(得分:1)

如果我在没有列表推导的情况下实现此功能,我会使用mapfilter

很高兴,你can easily do both of those with list comprehensions

我将避免使用您的代码,但作为示例,假设我有列表列表:

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

我想通过三个元素获得所有列表的兴奋版本:

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

编辑:注意到您的列是由index指定的。在这种情况下,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)]

答案 1 :(得分:1)

列表理解不能很好地通过索引删除,但这是一个尝试(作业调整):

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

答案 2 :(得分:0)

嗯,这不是一个答案,因为你请求使用列表推导。但我认为列表理解非常不适合这项任务。您只需takedrop

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 元素的列表一起追加。