我试图从OCAML的输入列表中获取所需数量的元素。例如,我将我的函数称为“take”,它带有两个参数“my_list”和“x”。这是:
let take my_list x =
let accum = ([],[],0) in
let f (all_groups, current_group, size) x =
if size then ((List.rev current_group)::(all_groups),[x],1)
else (all_groups, x::current_group,size + 1) in
let (groups,last,_) = List.fold_left f acc lst in
List.rev(List.rev last::group)
我遇到了类型错误:
此表达式具有bool类型,但预期表达式为类型 INT 为什么会这样?
我猜我的if _ else语句需要做些什么。我的理由是,如果我想从我的列表中取出所需数量的元素是真的(即如果我想从列表中取出3个元素,则执行此代码,不是2),然后继续。否则,继续将元素添加到当前列表,直到它填充了我想要取出的所需数量的元素。
感谢您的任何意见。
答案 0 :(得分:0)
让我们从您的打字问题开始吧。由于if size then ...
大小的get类型为bool,因为它在if表达式中显示为条件。稍后您尝试添加1。这对bool是不可能的,所以翻译抱怨。你实际上并不希望大小是bool,所以你应该检查以下内容。
if size >= x then ...
为了能够做到这一点,你不应该使用x
的list参数掩盖take
f
参数。我建议您将take
的参数重命名为n
或类似的内容,然后测试
if size >= n then
您还需要向accum
提供my_list
和fold_left
,而不是非现有参数acc
和lst
。
最后,你应该最终得到我认为按预期工作的内容:
let take my_list n =
let accum = ([],[],0) in
let f (all_groups,current_group, size) x =
if size >= n then ((List.rev current_group)::all_groups,[x],1) else (all_groups,x::current_group,size+1)
in let (groups, last, _) = List.fold_left f accum my_list in
List.rev((List.rev last)::groups)