嵌套循环末尾的OCaml语法错误

嵌套循环末尾的OCaml语法错误,ocaml,caml,Ocaml,Caml,我试图创建一个函数,根据规则计算一支球队赢得锦标赛的几率。我已经有了一个python实现,但我想尝试用OCaml来实现它,这是一种对我来说非常新的语言。我遇到了语法错误的问题,我不清楚为什么会出现这些错误。我也知道,因为我在翻译python中的代码,所以它对于OCaml来说不是最佳的,所以如果有更好的OCaml方法来完成我正在尝试的事情,我也希望听到反馈 open Format open List let tourney = [1;16;8;9;5;12;4;13;6;11;3;14;7;10

我试图创建一个函数,根据规则计算一支球队赢得锦标赛的几率。我已经有了一个python实现,但我想尝试用OCaml来实现它,这是一种对我来说非常新的语言。我遇到了语法错误的问题,我不清楚为什么会出现这些错误。我也知道,因为我在翻译python中的代码,所以它对于OCaml来说不是最佳的,所以如果有更好的OCaml方法来完成我正在尝试的事情,我也希望听到反馈

open Format
open List

let tourney = [1;16;8;9;5;12;4;13;6;11;3;14;7;10;2;15];;

let odds x =
  function y -> if x > y then 1.0-.(x/.x+.y) else y/.(x+.y);;



let replace l pos a  = List.mapi (fun i x -> if i = pos then a else x) l;;

let rec index l a =
  match l with
  | [] -> -1
  | x::xs -> if x != a then 1 + index xs a else 0;;

    
let seed_odds L seed =
  let team_ind = index tourney seed
  and rounds = [2;4;8;16]
  and round_odds = [] ;

  for i = 1 to length rounds do
    let temp = [] in
    for j = 1 to length tourney do
      0.0 :: temp;
    done;
    temp :: round_odds;
  done;
  
  for r = 0 to (length rounds)-1 do
    let groups = (length tourney) / (nth rounds r);

    for i = 0 to groups do
      let teams = slice tourney i*(nth rounds r) (i+1)*(nth rounds r);
      for t = 0 to (length teams) do
        let odds_to_advance = ref 0.0;

        
        let teams_ =
          if t < ((length teams) / 2) then slice teams ((length teams)/2) (length teams)-1 else slice teams 0 ((length teams)/2)-1 ;

        for t_ = 0 to length teams_ do
          if nth teams t != nth teams_ t_ then
            begin
              if (nth rounds r) = 2 then
                begin
                  odds_to_advance := odds_to_advance +. odds (nth teams t) (nth teams_ t_);
                end
              else
                begin
                  odds_to_advance := odds_to_advance +. (odds (nth teams t) (nth teams_ t_)) *. (nth (nth round_odds r-1 ) (index tourney (nth teams_ t_) )) ;
                end
            end
          else ()
        done;
        if nths rounds r > 2 then
          begin
            odds_to_advance := odds_to_advance *. (nth (nth round_odds r-1 ) (index tourney (nth teams t) )) ;
          end
        else ()
        (*replace (nth round_odds r) (i * (nth rounds r) + t) odds_to_advance ;*)
      done;
    done;
  done;

不确定现在的问题是什么,因为我检查了let语句,确保begin/ends已关闭,等等。

我看到的第一件事是,有相当多的let实例中没有匹配项

在模块的顶层,可以使用let name=value。这声明了一个要从模块导出的值

特别是在函数定义的其他地方,每个let都必须有一个匹配的in。let表达式如下所示:

let v = expr1 in expr2
它声明了一个值为expr1的局部变量v。此局部变量的作用域是expr2。in expr2部分不是可选的

以下是您在没有匹配项的情况下出租的行:

所有这些都是语法错误。通常,可以通过添加和删除分号(如果有的话)来修复它们

作为旁注,在OCaml中,分号用于分隔应按顺序计算的表达式。分号不像在受C语言影响的语言中那样是语句终止符。它是分隔符,在许多方面类似于运算符

更新


另一方面,一旦您的代码正常工作,您可能需要寻找方法使其更符合OCaml的习惯。例如,使用List.nth几乎总是不好的做法,因为到达列表的第n个元素需要线性时间。OCaml不像其他一些语言,它们所称的列表实际上是在固定时间内随机访问的数组。OCaml列表实际上是Lisp和其他FP语言中的列表。

我看到的第一件事是,有相当多的let实例中没有匹配项

在模块的顶层,可以使用let name=value。这声明了一个要从模块导出的值

特别是在函数定义的其他地方,每个let都必须有一个匹配的in。let表达式如下所示:

let v = expr1 in expr2
它声明了一个值为expr1的局部变量v。此局部变量的作用域是expr2。in expr2部分不是可选的

以下是您在没有匹配项的情况下出租的行:

所有这些都是语法错误。通常,可以通过添加和删除分号(如果有的话)来修复它们

作为旁注,在OCaml中,分号用于分隔应按顺序计算的表达式。分号不像在受C语言影响的语言中那样是语句终止符。它是分隔符,在许多方面类似于运算符

更新


另一方面,一旦您的代码正常工作,您可能需要寻找方法使其更符合OCaml的习惯。例如,使用List.nth几乎总是不好的做法,因为到达列表的第n个元素需要线性时间。OCaml不像其他一些语言,它们所称的列表实际上是在固定时间内随机访问的数组。OCaml列表实际上是Lisp和其他FP语言中的列表。

您需要显示看到的特定错误消息及其在代码中引用的位置。您需要显示看到的特定错误消息及其在代码中引用的位置。谢谢您的回答。我保留了原始代码供参考,但对其进行了调整以反映您建议的更改。我现在在第66行遇到了一个问题,但是我没有看到您上面提到的任何问题。快速看一下,似乎在循环和if之间需要一个分号。分号比终止符更像分隔符,但当有两个表达式要分隔时,您确实需要分号!:-好的,这是有道理的。这是否意味着循环中的if语句后面也应该有分号?我看不出后面的if语句。我只看到嵌套在另一个if语句中的if语句。所以我认为没有其他地方需要分号。但编译器是这方面的权威。因此,经过多次尝试和错误,编译器希望在行上方的else后面加一个分号,以round_lobbs.r开头,并在done语句之后加上分号。谢谢你的帮助,杰弗里!谢谢你的回答,杰弗里。我保留了原始代码供参考,但对其进行了调整以反映您建议的更改。我现在在第66行遇到了一个问题,但是我没有看到您上面提到的任何问题。快速看一下,似乎在循环和if之间需要一个分号。分号是分隔符,而不是术语
inators,但当有两个表达式需要分离时,您确实需要它们!:-好的,这是有道理的。这是否意味着循环中的if语句后面也应该有分号?我看不出后面的if语句。我只看到嵌套在另一个if语句中的if语句。所以我认为没有其他地方需要分号。但编译器是这方面的权威。因此,经过多次尝试和错误,编译器希望在行上方的else后面加一个分号,以round_lobbs.r开头,并在done语句之后加上分号。谢谢你的帮助,杰弗里!
let v = expr1 in expr2
let team_ind = index tourney seed

let groups = (length tourney) / (nth rounds r);

let teams = slice tourney i*(nth rounds r) (i+1)*(nth rounds r);

let odds_to_advance = ref 0.0;

let teams_ =