列表中的OCaml [a1,...,ai,ai + 1,....,an]列出[ai + 1,...,an,a1,.... ai]

时间:2016-11-04 09:16:35

标签: list pattern-matching ocaml

我的练习有问题!

我的想法是创建两个函数:

  1. 第一个函数创建列表[ai + 1, ..., an]
  2. 第二个函数,将第一个函数的结果作为输入并返回结果:[ai + 1, ..., an, a1, ..., ai]
  3. 问题是我刚刚开始使用Ocaml进行编程,而且我不太了解如何使用它。所以我有一些错误,我不知道如何解决。 我的代码是这样的:

    let rec produceprima l i =
     let rec produceprima_aux l i acc=
      let rec aux l i acc l1 =
       match l with
        []-> []
        |x::y -> if(acc>i) then aux y i acc+1 l1@[x] 
                 else aux y i acc+1 l1
      in aux l i acc l1
     in produceprima_aux l i acc;;
    
    let rec produceseconda l i =
     let rec produceseconda_aux l i acc=
      let rec aux l i acc l1 =
       match l with
        []-> []
        |x::y -> if(acc<=i) then aux y i acc+1 l1@[x] 
      in aux l i acc l1
     in produceseconda_aux l i acc;;
    

    第一个功能的错误是:

    Error: This expression has type 'a -> 'b list
           but an expression was expected of type int
    

    第二个功能我必须尝试,但肯定它有错误!

1 个答案:

答案 0 :(得分:0)

表达式f x+1由编译器解析为(f x) + 1。事实上,您省略了操作员名称周围的空格并没有给它任何优先权。因此,您应该写aux y i (acc+1) l1,而不是aux y i acc+1 l1

这是一个非常常见的错误。我建议你试试OCamlPro教程。特别是,第5课,侧重于语法陷阱。