2017-01-16 12 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が2回現れるので!

編集:

データ型:

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'の長さをとり、指定されたリストで頻繁に発生するすべての" article "を放出しますか? –

+0

はい、正しいです。実際には、問題は、記事のリストがあれば、そのすべてを持つMagasin(ショップ)を見つけることです。私のコードは記事のリストにある1つの本のために働いています。 'disponible [" HP7 "] [(E Proxis" HP7 "20)、(E Libri" HP7 "50)、(E Amazon" Haskell "45)、 Proxis "Haskell" 45)] ' は '((Libri、50.0)、(Proxis、20.0)] 'を発行します。 しかし、私はより1品含むList与える場合: 'disponible [ "HP7を"、 "ハスケル"] [(E Proxis "HP7" 20)、(E liberの複数形 "HP7" 50)、(Eアマゾン "ハスケル" 45)、(E Proxis "ハスケル" 45)] ' が発する' [(liberの複数形、50.0)、(Proxis、20.0)、(Proxis、45.0)、(アマゾン、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 
関連する問題