在ocaml中获取语法错误

时间:2018-04-30 23:28:07

标签: syntax-error ocaml

我正在尝试创建一个允许在ocaml中创建表的模块。它会执行一个名为project的查询来限制表的值。但是在函数选择器的定义的最后一行我得到语法错误。

module type TABLE = 
sig
  type database
  type table 
  val create_table: string list * string list* (string list) list -> table
  val printTable : table -> string
  val listToString : string list -> string
  val project : string list * table -> table
  val chooser : string list * string list-> string list
end;;

module UsingTable : TABLE =
struct 
  type table = (string list * string list* (string list) list) 
  type database = table list
  let create_table (a,b,c) = (a,b,c)

  let chooser inputList = (    
    for i = 0 to (List.length trueFalseList-1) do
      if List.nth trueFalseList i = "True"
      then  
        (List.nth inputList i)::ans
    done
      List.rev ans;;)

  let project (conditions, aTable)= (
    let rec innerProc tmp= function
        n,[],v->List.rev tmp
      |n,cH::cT,v-> if List.mem cH conditions 
          then innerProc (["True"]::tmp) (n,cT,v) 
          else innerProc (["False"]::tmp) (n,cT,v) 
    in 
    let trueFalseList = innerProc [] aTable




    let rec finalListCreator = match aTable with
        n,[],[]->n,[],[]
      |n,cH::cT,[]->n,chooser cH ::finalListCreator cT,[]
      |n,c,h::t -> n,c,chooser h ::finalListCreator t

  )


  let rec listToString aList = match aList with
      [] -> ""
    | h::t -> "\t"^h^"\t"^listToString t


  let rec printTable aTable = match aTable with 
      [],[],[] -> ""
    | [],[],vH::vT -> "\n"^(listToString vH)^printTable ([],[],vT)
    | [],cH::cT,v -> "\t"^cH^"\t"^printTable([],cT, v) 
    | n, c , v-> "\n"^(List.hd n)^"\n\n"^printTable([],c, v)




end;;

let atable =UsingTable.create_table (["Student"], ["Id";"Name";"Gender";"Course"], 
                                     [["001";"Jim";"M";"AlgoDS"];
                                      ["002";"Linnea";"F";"Databases"];
                                      ["003";"Anna";"F";"C#"];
                                      ["004";"Abby";"F";"C#"];
                                      ["005";"Arthur";"M";"JavaScript"]]);; 
print_string (UsingTable.printTable atable) ;;

1 个答案:

答案 0 :(得分:4)

这些行至少有两个语法问题:

let chooser inputList = (    
  for i = 0 to (List.length trueFalseList-1) do
    if List.nth trueFalseList i = "True"
    then  
      (List.nth inputList i)::ans
  done
    List.rev ans;;)

首先,for .. done是一个表达式,List.rev ans是另一个表达式。你需要一个分号(;)。

其次,只有在希望处理该点的输入时,才应使用;;。但是,如果您在;;处理输入,则缺少右括号。

在我看来,你应该只在顶层进入;;。考虑此令牌的最佳方式是作为顶级指令。它不是正常的OCaml语法的一部分。

这些只是前两个错误。代码中还有很多其他错误。将一个函数一次添加到模块中可能会很好,这样您就可以一次专注于一些问题。

<强>更新

您使用的环境有点复杂,因为它有一个评估按钮,要求评估您目前所输入的内容。这使得;;令牌的用处更少。

在不使用;;令牌的情况下使用此环境将是一个很好的规则。您只需在需要评估时点击评估按钮。

主要技巧是如果你想在外层评估一个语句(OCaml中的单位值表达式),比如说Printf.printf "hello world\n"。在此之前避免放置;;的通常习惯是将其变成如此声明:

let () = Printf.printf "hello world\n"

这是人们在编写源代码时使用的一个非显而易见的习惯用法(;;几乎从未出现在我的经验中)。