我正在尝试创建一个允许在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) ;;
答案 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"
这是人们在编写源代码时使用的一个非显而易见的习惯用法(;;
几乎从未出现在我的经验中)。