从列表OCAML中获得所需数量的元素

时间:2018-02-11 16:10:40

标签: list functional-programming ocaml

我试图从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),然后继续。否则,继续将元素添加到当前列表,直到它填充了我想要取出的所需数量的元素。

感谢您的任何意见。

1 个答案:

答案 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_listfold_left,而不是非现有参数acclst

最后,你应该最终得到我认为按预期工作的内容:

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)