список кортежей в haskell, с уникальными кортежами - PullRequest
1 голос
/ 29 ноября 2011

Я родом из Python и Java, поэтому Haskell для меня совершенно другой.Я пытаюсь учиться, но я застрял на этом.

У меня есть упорядоченный список кортежей, [(name, studentNumber)], и я хочу отфильтровать этот список так, чтобы каждый студент и каждыйstudentNumber появляется только один раз.Так как кортежи упорядочены, я хочу сохранить первый экземпляр имени или studentNumber и удалить любые другие, которые могут появиться.

Я попытался создать список со списком, но я не уверен, как проверить, еслиимя или номер уже добавлены в список.

Ответы [ 3 ]

5 голосов
/ 29 ноября 2011

Звучит так, как будто вы хотите (в первом неэффективном приближении) что-то вроде этого:

import Data.List (nubBy)
import Data.Function (on)

filt = nubBy ((==) `on` snd) . nubBy ((==) `on` fst)

При первом вызове nubBy появится список, в котором каждое имя отображается толькоодин раз, и затем он будет передан второму, в результате чего появится список, в котором каждое число появляется только один раз.

Простое использование nub приведет к списку, в котором каждая пара (name,number) встречается только один раз.;все еще могут быть повторения имен с разными номерами и числами с разными именами.

(Конечно, что-то нестандартное с аккумулятором будет быстрее.)

1 голос
/ 29 ноября 2011

Вы можете шпионить за Data.List источниками и написать свою расширенную nub функцию:

type Student = (Name, Number)
type Name = String
type Number = Int

unique :: [Student] -> [Student]
unique = go [] [] 
  where
    go unames unumbers (s@(name, number):ss)
      | name `elem` unames || number `elem` unumbers = go unames unumbers ss
      | otherwise = s : go (name:unames) (number:unumbers) ss
    go _ _ [] = []

Должен делать то, что вы хотите.

0 голосов
/ 29 ноября 2011

Для уникального списка всегда есть функция nub из прелюдии, я думаю, что она должна делать именно то, что вам нужно!

...