Recursion 为什么我的函数是';列表*';列表->';b名单?
我想我希望它是“a列表*”a列表->“a列表”类型 交集应返回两个列表的交集 输入和输出示例: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
- 交叉点([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工作),但我不想去掉元组中不需要的(且未更改的)第二个列表。谢谢!