1

看我的代码:

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 * 'a list 但表达式应为 int list 类型

你能帮助我吗 ?

4

1 回答 1

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,应该绑定到折叠调用之上。

.....
let helper (i, acc, res) x = 
    .....
in fold_left helper (0, [], []) lst;;
于 2013-10-27T13:48:28.513 回答