2017-02-11 16 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 является список СДЕЛКИ

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

+0

Очень тщательная обратная связь. :) –

+0

Я думаю, что строка 'getTransIndex (_, []) = ~ 1;' предназначена для определения пустого списка, но отсутствует его '|'. – molbdnilo

+0

@molbdnilo Вы, несомненно, правы.Я так привык к тому, что сначала увидел первый случай в основе списка, в котором я читал эту строку в качестве тестового примера для определения функции над ним. Я отредактирую ответ. Благодарю. –