OCaml主要功能

时间:2016-05-08 05:28:07

标签: functional-programming ocaml main

我需要一个主函数来运行其他函数。

我试过了:

let main () = 
  let deck = make_mazo in 
  let jugadores = players [] 0 in
  dothemagic deck jugadores 0 [] [] [];;

但我收到了这个错误:

  

文件" game.ml",第329行,字符37-39:   错误:语法错误

我认为;;是问题,我需要一种不同的方式来结束代码。也请尝试仅使用;,问题是相同的。

[编辑]

此处更新

let main = 
  let deck = make_mazo [] in 
  let game = players deck [] 0 in
  let dd = fst game in 
  let jugadores = snd game in
  dothemagic dd jugadores 0 [] [] [] [];

let () = main;;

错误仍然存​​在:

  

文件" game.ml",第253行,字符13-15:   错误:语法错误

其他功能完美正常,但我需要一个主要功能,因为我想用ocaml game.mlocamlbuild game.native

运行程序

[第二编辑]

@camlspotter响应之后:使用;代码是错误的。删除它。

更新2.0

let main = 
  let deck = make_mazo [] in 
  let game = players deck [] 0 in
  let dd = fst game in 
  let jugadores = snd game in
  dothemagic dd jugadores 0 [] [] [] []

let () = main;;

新错误:

  

文件" game.ml",第253行,字符0-3:错误:语法错误

现在认为let是问题,所以我尝试使用此

let main = 
  let deck = make_mazo [] in 
  let game = players deck [] 0 in
  let dd = fst game in 
  let jugadores = snd game in
  dothemagic dd jugadores 0 [] [] [] []

main;;

但错误是:

  

文件" game.ml",第253行,字符4-6:   错误:语法错误

4 个答案:

答案 0 :(得分:1)

您在此处显示的代码没有任何语法错误。

很可能问题是在您未显示的部分的末尾附近,例如文件的第324行附近。

如果我不得不猜测,我会说第324行以in结尾: - )

作为旁注,你还需要调用这个主要功能。您可能希望文件的最后一行是这样的:

let () = main ()

(这条线出现在我的许多OCaml项目中。)

答案 1 :(得分:0)

在ocaml中,没有其他语言的主要功能,请参阅下面的代码:

let () = print_string "hello\n";;
let f = print_string "hello, this is f\n";;
let () = f;;

答案 2 :(得分:0)

与许多其他语言的程序不同,OCaml程序没有特定的入口点:模块(文件)中的所有代码按从上到下的顺序进行评估,类似于脚本语言。你会看到一个常见的习语是:

let name = "World" (* I could have added a ;; at the
                    * end of this line, but that would
                    * have been unnecessary *)

let () =
  Printf.printf "Hello, %s!\n" name

将输出

Hello, World!

let () = ...可能看起来有点不稳定,但它实际上只是模式匹配:Printf.printf的返回类型是单位,()也是类型unit,你真的只是说“将这个unit值与评估这个表达式的结果相匹配”。基本上,这个习语意味着“以安全的方式运行这种单位式表达”。

类似的,尽管非常气馁的习语,使用了全能模式:

let greet s =
  match s with
  | "" -> false
  | _ ->
      Printf.printf "Hello, %s!\n" s;
      true

let name = "World"

let _ =
  greet world

catch-all模式并不关心它所匹配的表达式的类型(或值),这个习语意味着“运行这个表达式并丢弃它返回的任何内容”。

答案 3 :(得分:0)

要解决我的问题,我必须按以下方式编写函数,

let fun x =
let y = blabla in
code_returning_unit; (* Use ; for unit returns *)
return_value;; (* Use ;; for end of fun *)

感谢大家的帮助。