2013-10-07 5 views
0

Есть ли простой способ изменить [[int]] на [int] или сравнить их в этой форме, чтобы узнать, отсутствуют ли элементы.basic haskell: converting [[int]] to [int]

Например

set1= [[1,2,3]] 
    set2= [2,3,] 

для возврата [1]. Я попытался это:

return s1 s2= [x|x<-s1,y<-s2, x/=y] 

Развейте Вопрос: как я могу предотвратить дубликаты возвращается например, если

set1 = [[1,1,1,2,3] 

как я могу получить функцию возврата, чтобы дать мне только [1]

+0

Действительно ли это то, что вы хотите? «Как я могу получить функцию возврата, чтобы дать мне только [1]», а не [1,2,3] –

+1

Здесь действительно несколько отдельных вопросов. Я не уверен, что вас спрашивают? Как удалить дубликаты? Как найти разницу между двумя списками? Как преобразовать список списков в int? –

+0

btw вы не можете завершить объявление списка с помощью комы, как в set2 выше –

ответ

1

Там, как представляется, примерно три различных вопросов здесь.

Первый вопрос, как преобразовать список списков ints в список?

concat [[1,1,2],[2,1,3]] == [1,1,2,2,1,3] 

Второй вопрос, как удалить дубликаты из списка? Вы можете использовать nub для этого (не забудьте import Data.List):

nub [1,2,1,3] == [1,2,3] 

Может быть, вы просто хотите удалить последовательные дубликаты? Например, если вы знаете, что вы уже отсортировали список:

map head (group [1,1,1,2,3]) == [1,2,3] 

В том, что group группирует их в списки последовательных дублей, то head используется для возврата только первый из каждой группы дубликатов.

Третий вопрос, как найти элементы в list1, которые не в list2:

list1 \\ list2

Будьте осторожны, что \\ может не работать должным образом, если списки Арен» t в порядке, и если в один список включены обманки. Прочтите внимательно, если вы хотите понять, что это поведение в этих случаях.

+0

Я, наверное, не должен был включать эти три ответа! Три вопроса, возможно, должны быть отдельными вопросами о SO. –

+0

Да, это похоже на то, что он добавляет все больше и больше вопросов: D –

3

Если у вас есть [[1,2,3]], вы можете использовать только concat

Prelude> x 
[[1,2,3]] 
Prelude> concat x 
[1,2,3] 
Prelude> 

Для второй части, я предлагаю вам прочитать эту Algorithm - How to delete duplicate elements in a Haskell list

Существует прямо вперед осуществление там.

+2

Почему не просто '' head''? – fjarri

+0

Отлично! Спасибо, но есть ли в любом случае я могу предотвратить дублирование в моем коде? Например, если в наборе 1 было два, я могу предотвратить возвращение двух 1? – John

+0

@Bogdan head будет работать в этом случае, но если set1 был [2,3,1] или [2,1,3], это не так. – John

0

Использование concat для преобразования из [[a]] в [a] и nub (от Data.List) для удаления повторяющихся элементов из списка.

Демонстрация в GHCI:

> import Data.List (nub) 
> let set1 = [[1,2,3]] 
> let set2 = [2,3] 
> concat set1 == set2 
False 
> let set1 = [[1,1,1,2,3]] 
> nub (concat set1) 
[1,2,3]