在SML中引发异常编译

时间:2017-02-11 09:56:29

标签: 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作为结果。

所以我想解决问题。解决方案是什么?

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 Edit :正如@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的行