2017-01-16 69 views
0

的长度比较,我有以下列表:Haskell中的列表 - 计数FST元组与列表

[(Libri,50.0),(Proxis,20.0),(Proxis,45.0),(Amazon,45.0)] 

而且我有一定的列表,名为articles。 我想要使用元组来变换上面的列表,如果我有(长篇文章)乘以列表中出现的元组的第一个元素,就只能得到它!

因此,举例来说,如果我有一个列表articles=["HP","Haskell"],列表应显示:

[(Proxis,20.0),(Proxis,45.0)] 

因为Proxis显示了两番!

编辑:

数据类型:

data Magasin = Proxis | Amazon | Libri deriving (Eq, Show) 
type Article = String 
type Prix = Float 
data Entree = E Magasin Article Prix deriving (Eq, Show) 
type Stock = [Entree] 

这是我当前的代码:

disponible::[Article]->Stock->[(Magasin,Float)] 
disponible [] stk = [] 
disponible (art:reste) stk = (foldl(\acc (E m a p)->if a==art then (m,p):acc else acc) [] stk)++(disponible reste stk) 

任何想法?

编辑:

disponible::[Article]->Stock->[(Magasin,Float)] 
disponible articles stock = map(\(m,ls)->(m,sum $ map (\(E _ _ p)->p) ls)) $ filter ((==length articles).length.snd) magasinsArticles 
    where contientArticles = (filter (\(E _ a _)->a`elem`articles) stock) 
      magasins = foldl (\acc e-> if e`elem`acc then acc else (e:acc)) [] $ map (\(E m _ _)->m) contientArticles 
      magasinsArticles = map (\m->(m,filter(\(E m2 _ _)->m2==m) contientArticles)) magasins 

找到我一直在寻找的答案。

+0

所以,如果我理解正确,你采取'articles'的长度,并发出每一个“文章”,通常在给定的列表中发生? –

+0

是的,这是正确的。实际上,问题是要找到一篇文章列表,其中包含所有这些文章的Magasin(商店)。我的代码适用于以下文章列表中的一本书: ''disponible ['HP7'] [(E Proxis“HP7”20),(E Libri“HP7”50),(E Amazon“Haskell”45) Proxis“Haskell”45)]' 发出 '[(Libri,50.0),(Proxis,20.0)]''。但是如果我给出一个包含多于一篇文章的列表: 'hp7','Haskell'] [(E Proxis“HP7”20),(E Libri“HP7”50),(E亚马逊“Haskell” 45),(E Proxis“Haskell”45)]' 发出 '[(Libri,50.0),(Proxis,20.0),(Proxis,45.0),(Amazon,45.0)]'。 –

+0

因此,它发出具有其中一个或另一个的商店,而不是具有两个商店的商店:/ –

回答

0
disponible::[Article]->Stock->[(Magasin,Float)] 
disponible articles stock = map(\(m,ls)->(m,sum $ map (\(E _ _ p)->p) ls)) $ filter ((==length articles).length.snd) magasinsArticles 
    where contientArticles = (filter (\(E _ a _)->a`elem`articles) stock) 
      magasins = foldl (\acc e-> if e`elem`acc then acc else (e:acc)) [] $ map (\(E m _ _)->m) contientArticles 
      magasinsArticles = map (\m->(m,filter(\(E m2 _ _)->m2==m) contientArticles)) magasins