Я предполагаю, что вы запустили базовый случай в своей функции накопителя
intersection_acc (acc, h::t, []) = []
она, вероятно, должна возвращать что-то в зависимости от acc
:
intersection_acc (acc, h::t, []) = acc
Причина 'b list
появляется потому, что пересечение всегда будет возвращать пустой список [].Поскольку вы не используете этот пустой список, компилятор должен быть консервативным и утверждать, что список может быть любого типа.
В любом случае ваша функция выглядит более запутанной.Вы действительно хотите сделать что-то вроде
result = []
for each item in list1:
if item in list2:
add item to result
return result
Перевод этого императивного кода в рекурсивную функцию с параметром аккумулятора:
fun go(acc, []) = acc
| go(acc, x::xs) =
if x in list2 then
go(x::acc, xs)
else
go(acc, xs)
Для полной функции:
fun intersect(list1, list2) = let
fun go(acc, []) = acc
| go(acc, x::xs) =
if x in list2 then
go(x::acc, xs)
else
go(acc, xs)
in go([], list1)