嵌套循环末尾的OCaml语法错误
我试图创建一个函数,根据规则计算一支球队赢得锦标赛的几率。我已经有了一个python实现,但我想尝试用OCaml来实现它,这是一种对我来说非常新的语言。我遇到了语法错误的问题,我不清楚为什么会出现这些错误。我也知道,因为我在翻译python中的代码,所以它对于OCaml来说不是最佳的,所以如果有更好的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
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_ =