编译期间OCaml类型不匹配

时间:2013-10-27 13:01:19

标签: ocaml fold type-mismatch

看看我的代码:

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的表达式

你能帮助我吗?

1 个答案:

答案 0 :(得分: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;;