Получение синтаксической ошибки в ocaml - PullRequest
0 голосов
/ 01 мая 2018

Я пытаюсь создать модуль, который позволил бы создать таблицу в 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 голосов
/ 01 мая 2018

Эти строки имеют как минимум две синтаксические проблемы:

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.

Это только первые две ошибки. В коде немало других ошибок. Возможно, было бы неплохо добавить одну функцию за раз, чтобы вы могли сосредоточиться на нескольких проблемах одновременно.

Обновление

Среда, которую вы используете, немного сложнее, потому что она имеет кнопку Evaluate , которая запрашивает оценку того, что вы набрали до сих пор. Это делает маркер ;; гораздо менее полезным.

Было бы неплохо использовать эту среду без использования токена ;;. Просто нажмите кнопку Evaluate , когда вы хотите оценку.

Основная хитрость заключается в том, что если вы хотите оценить оператор (выражение с единичным значением в OCaml) на внешнем уровне, как, скажем, Printf.printf "hello world\n". Обычная идиома, позволяющая избежать ввода ;; перед этим, состоит в том, чтобы превратить это в объявление, например:

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

Это одна неочевидная идиома, которую люди используют при написании исходного кода (где ;; почти никогда не появляется в моем опыте).

...