2017-01-16 8 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 Потому что показывает два раза!

Edit: Типы

данных:

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) 

Любые идеи?

Edit:

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

Итак, если я правильно понимаю, вы берете длину «статей» и выделяете каждую «статью», которая часто встречается в данном списке? –

+0

Да, это правильно. Собственно, вопрос состоит в том, чтобы найти, учитывая список статей, Magasin (магазин), в котором есть все. Мой код работает для одной книги в списке статей: 'disponible [" HP7 "] [(E Proxis" HP7 "20), (E Libri" HP7 "50), (E Amazon" Haskell "45), (E Proxis «Haskell» 45)] ' испускает ' [(Libri, 50.0), (Proxis, 20.0)] '. Но если я даю Список, содержащий более 1 статьи: 'disponible [" HP7 "," Haskell "] [(E Proxis" HP7 "20), (E Libri" HP7 "50), (E Amazon" 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 

 Смежные вопросы

  • Нет связанных вопросов^_^