2016-03-13 3 views
-1

Скажем, у меня есть тип даты, как этот:Как получить список тех значений, которые удовлетворяют этому условию?

type GroupNb = Int 
type Code = Int 
type Name = String 
type Random = Int 

data Group = Group GroupNb Code Name Random deriving Show 

И я «добавить» некоторые данные (группы) в нем.

Теперь я хочу, чтобы получить список всех GroupNb, имеющих 1 как Code и "test" как Name.

groupNumbers :: [Group] -> [a] 
groupNumbers (Group _ a b _) = nub[List.find (a == 1 && b == "test") [GroupNb]] 

Это решение не работает ... Как я могу сделать что-то подобное?

+1

Функция, которую вы ищете, является 'filter'. – dfeuer

ответ

3

Если я правильно понял вашу проблему, у вас есть список Group, который вы хотите фильтровать на основе предиката (code == 1 && name == "test"). Это точно для функции filter. Так это то, что ваш код выглядит следующим образом:

someTest :: Group -> Bool 
someTest (Group _ code name _) = code == 1 && name == "test" 

allGroupPassingTest :: [Group] -> [Group] 
allGroupPassingTest g = filter someTest g 

Вспомогательный метод someTest является предикат, который filter использует.

Ваш первоначальный код был довольно сломанным, because in haskell functions must start with a lower case. Тестирование равенства также было нарушено, потому что = предназначен для назначения, а не для проверки равенства (вы ищете ==). Я не знаю, что здесь делают квадратные скобки nub[List.find (a = 1 && b = "test") [GroupNb]]. Единственное использование квадратных скобок (насколько мне известно) представляет собой список или тип списка. [GroupNb] похоже, что вы пытаетесь отнести свой список к этому типу, но способ отливки - использовать statement :: TypeCast. List.find (a = 1 && b = "test") почти прав, но это (a = 1 && b = "test") должно быть написано как лямбда как это (\(Group _ code name _) -> code == 1 && name == "test").

GroupNumbers :: Group -> [a] 
GroupNumbers (Group _ a b _) = nub[List.find (a = 1 && b = "test") [GroupNb]] 
+0

Благодарю вас за все эти отзывы! Но я пытаюсь вернуть список, содержащий все GroupNb (только GroupNb, без дубликата), которые будут включены в результат, который вы получите с помощью своего решения. – Caro

+0

Фильтр не удаляет дубликаты (но 'nub' делает). Фильтр удаляет только элементы из списка, который не передает тест (т. Е. Предикат возвращает false для этого элемента). –

+0

Спасибо, но знаете ли вы, как я могу составить список всех GroupNb, включенных в итоговую группу? – Caro

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