【问题标题】:Recognition of data type in SMLSML中数据类型的识别
【发布时间】:2012-11-28 06:05:41
【问题描述】:

这是令人困惑但有效的代码。我只是想要一些帮助来理解为什么 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。

谢谢。

【问题讨论】:

    标签: sml smlnj


    【解决方案1】:

    do2的定义中,l是一个列表。 do2 然后以l 作为第一个参数调用do1,所以do1 的第一个参数a 也是一个列表。现在在第 2 行,您输入a = List.nth(k,n)。所以既然a 是一个列表,那么List.nth(k,n) 也必须是一个列表。这意味着k 必须是列表列表。这又意味着k::ks 必须是列表列表的列表。

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

    【讨论】:

      【解决方案2】:

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

      在函数中,

      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 []
      

      【讨论】:

        猜你喜欢
        • 2013-11-17
        • 2016-10-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-04-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多