看看我的代码:
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的表达式
答案 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;;