我在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 Edit :正如@molbdnilo指出的那样,这可能是基础案例。如果是这样,它就会丢失|
,并且也有些错位,因为首先让案例[]
更为惯用。
4)let val i = 0 in
有点无意义。为什么不使用文字值0
并删除let ... in ... end
。
5)TRANSACTION
和TRANSLIST
显然是类型。标准的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
的行