0

这是令人困惑但有效的代码。我只是想要一些帮助来理解为什么 k::ks 被视为'list list list 而不是'list list。我想获取一个列表和列表列表并检查第一个列表是否是必要的。必要的意思是,第一个列表中的所有元素是否都可以在另一个列表中找到。

fun do1(a,[],_)=false
|do1(a,k::ks,n)=if a=List.nth(k,n)orelse do1(a,ks,n) then true else false;

val n=0;
fun do2([],k::ks,_)=[]
|do2(_,[],_)=raise unexpected
|do2(l,k::ks,n)=if List.nth(l,n-1)=0 then do2(l,k::ks,n+1)
                        else 
                        if do1(l,k::ks,n) then []
                        else l;

重复问题:我只是想要一些帮助来理解为什么 k::ks 被视为'list list list 而不是'list list。

谢谢你。

4

2 回答 2

0

在 的定义中do2l是一个列表。do2然后调用do1withl作为第一个参数,所以 , 的第一个参数do1也是a一个列表。现在在第 2 行,您可以这样做a = List.nth(k,n)。所以既然a是一个列表,那么List.nth(k,n)也一定是一个列表。这意味着它k必须是一个列表列表。这反过来意味着它k::ks必须是列表列表的列表。

PS:通常当试图找出编译器推断出与预期不同的类型时,将类型注释添加到函数定义中会有所帮助。通常,由此产生的类型错误会让您更清楚地了解编译器对所涉及类型的看法与您的不同之处。

于 2012-11-27T21:31:32.257 回答
0

虽然这种类型的代码并没有真正交换想法,但我已经包含了解决方案。

在函数中,

fun do2([],k::ks,_)=[]
|do2(_,[],_)=raise unexpected
|do2(l,k::ks,n)=if List.nth(l,n-1)=0 then do2(l,k::ks,n+1)
                        else 
                        if do1(l,k::ks,n) then []
                        else l;

倒数第二行

if do1(l,k::ks,n) then []

应该

if do1(List.nth(l,n-1),k::ks,n) then []
于 2012-11-27T21:43:38.073 回答