2013-12-17 3 views
1

Я в настоящее время работает с графиками в Haskell, где график представляет собой список кортежей:Получение первого элемента кортежа, в списке кортежей

type Graph = [(Node, Node)]

И мне нужно сделать список всех узлов, содержащихся в графе, моя идея состояла в том, чтобы взять первый элемент каждого кортежа, а затем просто удалить дубликаты с помощью rmdup. Я действительно застрял здесь, и любая помощь будет очень признательна.

ответ

3

Если у вас есть график в переменной х, используйте

nub $ (map fst x) ++ (map snd x) 

map fst x получает все узлы в первом элементе кортежей, аналогично с snd. (++) объединяет их все вместе, а нуб удаляет дубликаты.

+0

Понимаете, ему не нужны были два элемента кортежей :) –

+0

@ MihaiMaruseac- Мне это непонятно .... Он сказал «все узлы». Это потому, что для тех, кто занимается графами, очевидно, что любая (a, b) ссылка нуждается в соответствующей (b, a) ссылке? – jamshidh

+0

«Моя идея состояла в том, чтобы взять первый элемент каждого кортежа, а затем просто удалить дубликаты с помощью rmdup». –

2

Если у вас есть список элементов типа t (то есть [t]) применить функцию над каждым элементом списка (скажем, с подписью t -> b) вам нужно использовать map:

Теперь, обращаясь к Hoogle и закладные элементы вместе мы имеем:

  • у меня есть список типа [(Node, Node)], скажем [(a, a)]
  • Я хочу, чтобы в результате чего-то типа [a].
  • Нам нужна функция для получения от типа [t1] типа [t2]. Searching мы добираемся до map :: (t1 -> t2) -> [t1] -> [t2]
  • Теперь нам нужна функция в map. Поставив вышеперечисленное, получим, что t1 = (a, a) пока t2 = a, поэтому нам понадобится функция (a, a) -> a. Searching мы получаем fst

Собираем все на месте: map fst list. Затем, чтобы удалить дубликаты, вы используете один и тот же подход поиска и достигнете nub.

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