2017-02-11 48 views
-1

我已经在SML中编写了下面的代码,但遇到了编译错误。在SML中引发异常编译

fun getTransIndex(t : TRANSACTION, (h::L) : TRANSLIST) : int = 
    let val i=0 
    in if (h=t) then i 
     else 
     if (getTransIndex(t,L)<>~1 
     then getTransIndex(t,L)+1 
     else ~1 
    end 

getTransIndex(_,[])=~1; 

TRANSACTION是与值的索引:1..3 TRANSLIST是TRANSACTION的列表

功能getTransIndex需要 colset TRANSACTION作为第一参数的交易标识和 记录,与colset TRANSLIST列表作为第二参数 ,并返回列表 (从0开始计数)中交易位置的指数。如果列表不包含此事务,则 函数返回-1作为结果。

所以我想解决这些问题。解决办法是什么?

+0

什么是实际的错误信息? –

回答

2

有几个问题是:

1)该行你

if (getTransIndex(t,L)<>~1 then 

2)SML无法分析)<>~1有一个多余的无与伦比的左括号。你应该引进各地<>

空间把这些两点在一起,该行应为:

if getTransIndex(t,L) <> ~1 then 

3)线路getTransIndex(_,[])=~1;真的是没有意义的。 _不是可以传递给getTransIndex的限制值,而空列表[]未被定义为h::L中使用的唯一模式所覆盖。您需要为getTransIndex(t,[])定义一个定义,或者不要将它传递给空列表。 On编辑:正如@molbdnilo指出的那样,这可能是基础案例。如果是这样,它就会丢失|,并且也会有些错位,因为首先有[]这种情况比较习惯。

4)let val i = 0 in有点毫无意义。为什么不使用文字值0并摆脱let ... in ... end

5)TRANSACTIONTRANSLIST显然是类型。在抽象数据类型中,为类型使用小写字母并为构造函数保留大写字母是标准的SML用法。

把所有这一切在一起(使用int作为一个独立的为您TRANSASCTION)导致如下代码:

type transaction = int 
type translist = int list 

fun getTransIndex(_,[]:translist) = ~1 
| getTransIndex(t:transaction,(h::L)) = 
    if (h=t) then 
     0 
    else 
     if getTransIndex(t,L) <> ~1 then 
      getTransIndex(t,L)+1 
     else ~1; 

没有理由明确地告诉SML是~1是一个int。另一方面,由于_不是普通标识符,所以_:transaction不能正常工作,所以我将类型注释:transaction移至包含t的行。

+0

非常全面的反馈。 :) –

+0

我认为'getTransIndex(_,[])=〜1'这行应该是空列表大小写的定义,但缺少它的'|'。 – molbdnilo

+0

@molbdnilo你毫无疑问是正确的。我习惯于在一个定义中首先看到空列表的基础情况,我将该行作为它上面的函数定义的测试用例。我会编辑答案。谢谢。 –