2011-09-26 17 views
0

刪除列表元素表是列表,其中所述數據被設置爲列表如下:使用列表解析由索引

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

不應該是列 - >表 - >表?否則,你不需要擔心嵌套列表。 –

+0

不,這個班的教授有一個刁難的窘境 – fotg

+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!" ] 
-- ] 

編輯:只注意到你的列由索引指定。在這種情況下,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

列表理解不能很好地工作通過索引中刪除,但這裏的一個嘗試。(作業調整):

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 
0

嗯,這不是一個答案,因爲你要求使用列表解析。但是我認爲列表理解對於這個任務是非常不適合的。您只需要takedrop

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

要在索引刪除一個元素,所述第一元件和列表與所述第一i + 1個的元件丟棄附加在一起。