Есть несколько проблем с этим:
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
является внутром. С другой стороны, _:transaction
не работает должным образом, так как _
не является обычным идентификатором, поэтому я переместил аннотацию типа :transaction
на строку, содержащую t
.
Каково фактическое сообщение об ошибке? –