Несоответствие типа OCaml во время компиляции

Посмотрите на мой код:

let my lst p q =
  if lst = [] then
    []
  else
    let i = 0 in let res = [] in let acc=[] in
    fold_left ( fun acc h -> 
      if (not (p h) && not(q h)) then
    ((i+1), [], res)
      else if (p h && not (q h)) then
    ((i+1), (i::acc),res)
      else if (not (p h) &&  q h) then
    ((i+1), [] (acc@res))
      else
    ((i+1), [], ((i::acc)@res))) 
     (i,acc,res) lst;;

И я получил ошибку компиляции:

Это выражение имеет тип int * int list * 'список, но ожидалось выражение типа int list

Можете вы помочь мне ?


person user2920874    schedule 27.10.2013    source источник
comment
На какую строку указывает ошибка компиляции?   -  person Robin Green    schedule 27.10.2013
comment
((i+1), (i::acc),рез)   -  person user2920874    schedule 27.10.2013
comment
Я думаю там опечатка (i+1), [] (acc@res)) не хватает запятой   -  person zurgl    schedule 27.10.2013


Ответы (1)


Проблема возникает из-за того, как вы используете функцию сгиба.

fold_left ( fun acc h -> 
  ...
)  

В отношении вашего аккумулятора, который представляет собой тройку, лучше поступить следующим образом:

 ....
fold_left ( fun (i', acc', res') h -> 
  here replace i, acc res by i' acc' res'
)  

Кроме того, удалите определения i, acc и res,.
Поместите их значения прямо так:

 ....
fold_left ( fun (i', acc', res') h -> 
  here replace i, acc res by i' acc' res'
)  (0, [], []) lst;;

Наконец, вызов анонимной функции fold_left должен быть связан выше вызова fold.

.....
let helper (i, acc, res) x = 
    .....
in fold_left helper (0, [], []) lst;;
person zurgl    schedule 27.10.2013
comment
np, последнее замечание, попробуйте оценить let lst = [] in List.fold_left (fun a x -> a*100 + x) 1 lst. - person zurgl; 27.10.2013