2014-10-29 41 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