2

我想我希望它是 'a list * 'a list -> 'a list 类型。

交集应该返回两个列表样本输入和输出的交集:

  • 交集([1],[1]);
    • [1]
  • 交集([1,2,3],[1,2]);
    • [1,2]
  • 交集([[2,3],[1,2],[2,3]],[[1],[2,3]]);
    • [[2,3]]

我的功能:

fun intersection (l1, l2) = let
    fun intersection_acc (acc, [], h::t) = []
        | intersection_acc (acc, h::t, []) = []
        | intersection_acc (acc, h::t, h2::t2) = if in_list (h, l2)
            then intersection_acc (h::acc, t, l2)    
        else intersection_acc (acc, t, l2)
    in intersection_acc ([], l1, l2)
end

我不认为 in_list 是问题,但看起来像这样:

 fun in_list (x, []) = false
    | in_list (x, y::r) = if x = y 
    then true 
    else in_list (x, r);
4

1 回答 1

3

我的猜测是你在你的累加器函数中搞砸了基本情况

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)
于 2011-10-29T23:59:34.293 回答