表是列表列表,其中数据设置如下:
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
答案 0 :(得分:1)
如果我在没有列表推导的情况下实现此功能,我会使用map和filter。
很高兴,你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)
嗯,这不是一个答案,因为你请求使用列表推导。但我认为列表理解非常不适合这项任务。您只需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 元素的列表一起追加。