2013-09-15 12 views
1

Я хочу, чтобы найти первое вхождение цифры в списке:найти первое вхождение в список

let pos_list = function (list , x) -> 
    let rec pos = function 
    |([] , x , i) -> i 
    |([y] , x , i) -> if y == x then i 
    |(s::t , x , i) -> if s == x then i else pos(t , x , i + 1) in pos(list , x , 0) ;; 

но компилятор жалуется, что выражение типа «UINT», а вместо этого был использован с тип "int".

ответ

1

Извлеките второй корпус из соответствия шаблону. Этот случай уже соответствует последнему с s = y, t = []. Таким образом, функция может быть упрощена

let pos_list (list, x) = 
    let rec pos = function 
    | ([], x, i) -> i 
    | (s::t, x, i) -> if s == x then i else pos(t, x, i + 1) in pos(list, x, 0) ;; 
+0

спасибо, это сработало – user22323

1

Почему вы используете == (физическое равенство) вместо = который является структурным равенство? Я понимаю, что это может не иметь значения, если у вас есть только целые числа, но это может привести к неожиданному поведению в будущем.

Смотрите раздел Сравнения в док: http://caml.inria.fr/pub/docs/manual-ocaml/libref/Pervasives.html

+0

yup you right, вот что нужно запомнить. – user22323

1

ответ Павла Zaichenkov является, конечно, лучше один, но вы можете быть заинтересованы в знании, точную причину ошибки. А именно, когда у вас есть

if y == x then i 

без соответствующего else выражения, все выражение рассматривается как

if y == x then i else() 

где () это единственное значение типа unit (а не uint), которая является тип выражений, которые оцениваются только для их побочных эффектов. Поскольку оба ветви if должны иметь один и тот же тип, i также имеет тип unit. Затем, при проверке типа третьей ветви сопоставления шаблонов, вы пытаетесь добавить i и 1, что означает, что i должен иметь тип int, следовательно, тип ошибки.

+0

спасибо за подробный ответ. – user22323

Смежные вопросы