Recursion 为什么我的函数是';列表*';列表->';b名单?

Recursion 为什么我的函数是';列表*';列表->';b名单?,recursion,functional-programming,type-inference,sml,smlnj,Recursion,Functional Programming,Type Inference,Sml,Smlnj,我想我希望它是“a列表*”a列表->“a列表”类型 交集应返回两个列表的交集 输入和输出示例: 交叉点([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

我想我希望它是“a列表*”a列表->“a列表”类型

交集应返回两个列表的交集 输入和输出示例:

  • 交叉点([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_列表是个问题,但看起来是这样的:

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

我猜你把累加器函数的基本情况搞糟了

intersection_acc (acc, h::t, []) = []
它可能会返回一些内容,具体取决于
acc

intersection_acc (acc, h::t, []) = acc
出现
'b列表
的原因是交叉点将始终返回空列表[]。由于您不使用空列表,编译器需要保守,并说列表可以是任何类型


无论如何,您的功能似乎从根本上更加混乱。你真的想做类似的事情吗

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)

你为什么把它标记为matlab?这显然是某种ML变体,而不是matlab。我猜是SML?对不起,我不知道有什么不同。我想这是SMLNJ。@Nate:ML与matlab无关。ML是一种函数式语言,MatLab是必不可少的。我觉得很傻。。。我假设ML是MatLab。对于这种混淆,很抱歉。“ML”作为语言家族的名称来自“元语言”。第一个ML变体由Robin Milner和其他人发明,作为证明环境的元语言。到目前为止,有几个证明环境是用某种ML变体编写的,Coq的策略可以作为OCaml函数提供(其他的我不知道)。关于我的基本情况,你是完全正确的。我脑子里对此感到困惑。你的围棋功能也比我的好。我最初将intersection_acc up设置为intersection之外的累加器函数,使用一个包含三个参数的元组(独立于intersection工作),但我不想去掉元组中不需要的(且未更改的)第二个列表。谢谢!