Не уверен, что «динамически» - правильное слово для этой проблемы.
Я некоторое время пытался найти решение для объединения нескольких списков в один список, но я начинаю думать что мой подход невозможен. Это хорошо работает для двух списков, но не для трех (и, вероятно, не более трех). Предполагается, что функция работает как transpose
, но в результате получается список целых чисел, а не список целых чисел. Но если это приводит к списку списков, это также будет работать. Теоретически, функция должна работать для произвольного количества списков.
Например, [1,2,3] myTranspose [4,5,6] myTranspose [7,8,9] должно привести к [ 1, 4, 7, 2, 5, 8, 3, 6, 9]
Возможно ли это?
Моя попытка на данный момент:
myTranspose :: [Int] -> [Int] -> [Int]
myTranspose [] [] = []
myTranspose [x] [] = [x]
myTranspose [] [y] = [y]
myTranspose [x] [y] = [x,y]
myTranspose (x:xs) [y] = (x:y:xs)
myTranspose [x] (y:ys) = (x:y:ys)
myTranspose (x:xs) (y:ys) = [x,y] ++ zip' xs ys
ИЗМЕНИТЬ МОЙ АКТУАЛЬНАЯ ЗАДАЧА:
Я должен был спросить об этом с самого начала, но я подумал, что было бы проще преобразовать задачу в список целых чисел. Извините за это.
У меня есть тип данных Function
и функция, которая связывает Function
с:
data Function where
(|||) :: Function -> Function -> Function
A :: Char -> Function
B :: Int -> Function
chain :: Function -> Function -> Function
chain f1 f2 = f1 ||| f2
И у меня также есть функция, которая должна работать например, транспонирование, как я описал выше:
(<|||>) :: Funcion -> Function -> Function
...something like this..
(<|||>) (p1 ||| p2) (q1 ||| q2) = (p1 <|||> q1) ||| (p2 <|||> q2)
(<|||>) (p1 ||| p2) q = p1 <|||> p2 ||| q
(<|||>) p (q1 ||| q2) = p ||| q1 <|||> q2
(<|||>) p q = p ||| q
Мне удалось решить проблему, используя обычные списки и обычную функцию транспонирования, как предложила Луна Goose. Но проблема в том, что компилятор жалуется на нехватку памяти, если я так делаю. Вызов функции будет выглядеть следующим образом, за исключением того, что список будет очень большим:
transpose ((A 'a' ||| B 5 ||| A 'n') <|||>
(A 'o' ||| B 3 ||| A 'p') <|||>
(A 'i' ||| B 0 ||| A 'l'))
Но когда я запускаю программу с "моей" функцией списка и несовершенной пользовательской функцией транспонирования, компилятор не Пожаловаться. Я думал, что это связано с ленью. Может ли это быть проблемой? Спасибо за помощь.