2014-10-29 42 views
0

提取元素,我有以下元組:如何從一個元組在Haskell

type Id = Int 
type Name = String 
type FSK = Int 
type Movie = (Id, Name, FSK) 

現在我想定義從一個給定的名單一樣,提取電影的功能:

extract :: Id -> [Movie] -> (Maybe Movie, [Movie]) 
extract = .... ?? 

這樣,當我給一個id和一個電影列表,它提取: 1)沒有+給定的列表,如果ID被發現 2)只是+電影,和沒有該電影的新列表,如果給定找到了id,並從列表中刪除了電影

例如:

*Main> extract 0 [(1,"Matrix",16),(2,"Gladiator",0)] 
(Nothing,[(1,"Matrix",16),(2,"Gladiator",0)]) 
*Main> extract 1 [(1,"Matrix",16),(2,"Gladiator",0)] 
(Just (1,"Matrix",16),[(2,"Gladiator",0)]) 

我應該如何定義函數?

+3

到目前爲止你有多遠? '.... ??'不是一個很大的嘗試。通常你可以通過模式匹配來選擇你所擁有的東西,例如你的'[Movie]'列表。 – luqui 2014-10-29 02:15:09

+1

它對'[]'做什麼?它爲'movie:xs |做了什麼?電影== ID'?它對於其他情況有什麼作用? – alternative 2014-10-29 02:33:25

回答

3
extract :: Id -> [Movie] -> (Maybe Movie, [Movie]) 
extract id []     = (Nothing, []) 
extract id ((fid, n, f):list) | fid == id = (Just (fid, n, f), list) 
           | otherwise = (found, (fid, n, f):tail) 
           where (found, tail) = extract id list