Haskell: архивирование списка xs с каждым списком в списке yss с использованием частичных приложений и - PullRequest
1 голос
/ 12 января 2010

Эй, я просто готовлюсь к экзамену по функциональному программированию, который будет проходить в пятницу, и я просто работаю над упражнениями нашего лектора. Я наткнулся на один, который мне немного помог:

6. а) Напишите функцию, которая упаковывает данный список xs с каждым списком в списке. Использовать частичное приложения и лямбда-выражения в максимально возможной степени в определении вашей функции. б) Напишите функцию, которая упаковывает каждый список в списке Yss списков с заданным списком xs. Использовать частичное приложения и лямбда-выражения в максимально возможной степени в определении вашей функции. Разница между вашими решениями части а) и части б) этой проблемы показывает, что частично прикладные функции должны принимать свои аргументы в правильном порядке.

Что у меня есть на данный момент для (а):

zipAll = (\ xs (ys: yss) -> [(zip xs ys)] ++ zipAll xs yss)

Я знаю, это не исчерпывающе, но кто-нибудь может дать мне несколько советов?

Ответы [ 2 ]

1 голос
/ 12 января 2010

Хорошо, я решил:

zipList :: [a] -> [[b]] -> [[(a,b)]]
zipList = \xs yss -> c xs yss
                        where
                                c xs [] = []
                                c xs (ys:yss) = zip xs ys :zipList xs yss

Жаль, что я не разместил это сейчас: P

1 голос
/ 12 января 2010

Похоже, что вам просто не хватает базового варианта, чтобы заставить функцию работать. Базовый случай будет

(\xs [ys] -> [(zip xs ys)])

Возможно, я бы вместо этого переместил параметры в правую часть уравнения:

zipAll xs (ys:yss) = ...

но это просто вопрос стиля.

Решение для части (b) такое же, за исключением того, что порядок параметров обратный, как

zipAll (ys:yss) xs = ...
...