Основная проблема в том, что вы повторяете оба списка.
Если вы посмотрите на ваш пример,
pair ([1,2], [3,4,5]) -> [(1,3), (1,4), (1,5), (2,3), (2,4), (2,5)]
, вы увидите, что у него есть два подсписка,
[(1,3), (1,4), (1,5)]
[(2,3), (2,4), (2,5)]
, где первый состоит из пар, образованных из первогоэлемент [1,2]
и каждый элемент [3,4,5]
, а второй является вторым элементом [1,2]
, также в паре с каждым элементом [3,4,5]
.
Обратите внимание, что каждый подсписок содержит все [3,4,5]
, но только одинэлемент [1,2]
- первый такой же, как pair ([1], [3,4,5])
, а второй - pair ([2], [3,4,5])
- поэтому вам нужно только выполнить рекурсию по первому списку.
Вы можете создать такой список следующим образом:
- Если какой-либо список ввода пуст, результат будет пустым.
- В противном случае:
- Возьмите первый элемент
a
и соедините его с каждым элементомb
в списке (подсказка: подумайте о map
.) - Рекурсивно создавайте пары из хвоста
a
и всех b
. - Объедините результаты 1и 2.
При сопоставлении с образцом:
fun pair ([], _) = []
| pair (_, []) = []
| pair (x::xs, ys) = <something involving x and ys, suitably combined with 'pairs (xs, ys)'>
Может помочь, если вы напишитешаг 1 как отдельная функция.