когда второй элемент в аргументе кортежа list1 соответствует элементу в списке 2,
, тогда я должен добавить элемент list1 в новый список вывода.
fun thing(x, y) =
if null x then []
else if #2 (hd x) = (hd y) then hd x @ thing(tl x, y)
else thing(tl x, y);
Вместоif null x then ...
, hd x
и tl x
, используйте сопоставление с шаблоном:
fun thing ([], _) = ...
| thing ((x,y,z)::haystack, needles) = ...
Чтобы выяснить, является ли y
членом needles
, создайте функцию принадлежности:
fun elem (p, []) = false
| elem (p, q::qs) = p = q orelse elem (p, qs)
Проверьте, если elem (y, needles)
, чтобы определить, следует ли включать (x,y,z)
как часть вашего результата.
Применить thing
рекурсивно к haystack
и needles
.
Составьте рекурсивный результат, используя оператор ::
(cons) вместо @
(append).
Вот как можно решить это упражнение с библиотечными функциями:
fun curry f x y = f (x, y)
fun thing (haystack, needles) =
List.filter (fn (x,y,z) =>
List.exists (curry op= y) needles) haystack