Вы хотите использовать настоящие кортежи или церковные кортежи? Я возьму первый.
Итак, начните с подписки требуемого типа. Вы хотите, чтобы он взял 2 разных Churchlist
s и произвел Churchlist
кортежей.
churchZip :: Churchlist a u -> Churchlist b u -> Churchlist (a,b) u
Теперь, как бы вы это реализовали? Напомним, что Churchlist
s представлены функцией, которая складывается над ними. Поэтому, если наш результат равен Churchlist (a,b) u
, мы хотим, чтобы он имел форму функции типа ((a,b) -> u -> u) -> u -> u
(это, в конце концов, эквивалентно синониму типа Churchlist (a,b) u
).
Что представляет собой следующий шаг? Ну, это зависит. Is l1
пусто? Как насчет l2
? Если любой из них, то вы хотите, чтобы результатом был пустой список. В противном случае вы хотите соединить первые элементы из каждого списка, а затем churchZip остальное.
churchZip l1 l2 c n
| isEmpty l1 || isEmpty l2 = n
| otherwise = c (churchHead l1, churchHead l2)
(churchZip (churchTail l1) (churchTail l2) c n
Это вызывает некоторые вопросы.
- Вы можете написать эту функцию рекурсивно? В чистом лямбда-исчислении вы должны написать рекурсивные функции с помощью оператора фиксированной точки (так называемого комбинатора y).
- У вас есть
churchHead
, churchTail
и isEmpty
? Вы готовы написать их? Можете ли вы написать их?
- Есть ли лучший способ структурировать эту функцию? Все может быть сделано с помощью складки (помните,
l1
и l2
фактически функция складывания над собой), но является ли это чистым решением этой проблемы?
Достижение этой цели чисто механическое, предполагая твердое понимание церковного кодирования списков. Я оставлю глубокое мышление до вас, так как это домашнее задание.
Вы пытались ограничить проблему из церковных списков церковными цифрами? Цифровой аналог 'zip' -' min'; это может дать вам некоторое представление. –
спасибо за совет, плохо попробуйте это и сообщите, если я нахожу что-то просветительское – niklas
Я думал, что это было проще, как мой пример conc2church выше. Я думаю, что в этом случае для меня это не так. благодарю вас в любом случае – niklas