Произвольные наборы ввода в списках в Haskell

Как в Haskell использовать произвольные входные наборы в списках?

Я приведу вам пример того, что мне нужно:

generate :: [[[Integer]]] -> [[[Integer]]]
generate a = [ result | 
      i1 <- a !! 0,
      i2 <- a !! 1,
      i3 <- a !! 2,
      i4 <- a !! 3,
      ...
      i99 <- a !! 99,
      let result = [i1,i2,i3,i4, ..., i99],
      isCorrect result
   ]

person Daniel O    schedule 27.12.2010    source источник
comment
Подожди, что? Чего ты хочешь? Ваш пример - это просто очень подробный способ нарезки и фильтрации.   -  person    schedule 28.12.2010
comment
@delnan Нет. Я могу понять, как можно было бы подумать с первого взгляда. То, что я хочу, больше похоже на поиск всех возможных перестановок матрицы.   -  person Daniel O    schedule 28.12.2010
comment
Нашел аналогичный вопрос: stackoverflow.com/questions /3742235/   -  person Daniel O    schedule 28.12.2010
comment
Существует очень четкое различие между (i1 ‹- a !! 0) и (пусть i1 = a !! 0). Также обратите внимание, что !! 0 дает список.   -  person Daniel O    schedule 28.12.2010


Ответы (1)


Предполагая, что a гарантированно имеет длину 100, я думаю, что вам нужно generate a = filter isCorrect $ sequence a. Здесь sequence используется в монаде [] для создания декартова произведения списка списков.

person Reid Barton    schedule 27.12.2010
comment
Очень, очень компактный код. Думаю, я научусь любить недавно найденную функцию последовательности! Спасибо. - person Daniel O; 28.12.2010