在SML中识别数据类型

时间:2012-11-27 19:54:11

标签: sml smlnj

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

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被列为'列表列表而不是列表列表。

谢谢。

2 个答案:

答案 0 :(得分:0)

do2的定义中,l是一个列表。 do2然后以do1作为第一个参数调用l,因此do1的第一个参数a也是一个列表。现在在第2行,你做a = List.nth(k,n)。因为a是一个列表,List.nth(k,n)也必须是一个列表。这意味着k必须是列表列表。而这反过来意味着k::ks必须是列表列表的列表。

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

答案 1 :(得分: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 []