如何解决如何修复此语法错误并改进代码?
我正在模拟滑动拼图游戏(请参阅游戏说明 https://en.wikipedia.org/wiki/Sliding_puzzle)。所以事情是这样的:
- 首先我创建了一个新类型:
type slidingPuzzle= {mat: char array array; mutable row: int; mutable column: int};;
row
和 column
表示空图块的坐标,mat
是拼图。
- 然后我做了一个打印拼图的函数,以便更好地解释:
let print_tile tile=
for i=0 to Array.length tile.mat -1 do
for j=0 to Array.length tile.mat.(0) -1 do
if i=tile.row-1 && j=tile.column-1 then
print_string " " else print_char tile.mat.(i).(j);
done; print_string "\n";
done;;
- 现在我想制作在拼图中滑动单元格的函数。这应该是一个以谜题和两个整数作为参数的函数。整数表示我们想要滑动到空块的单元格的位置。输出应该是改拼图。但如果该位置不与空图块相邻或该位置超出范围,则应返回未更改的拼图。
我的尝试:
let slide tile i j=
if (i=tile.row+1 && j=tile.column) || (i=tile.row-1 && j=tile.column) || (i=tile.row && j=tile.column+1) || (i=tile.row-1 && j=tile.column-1) then
tile.row<-i; tile.column<-j; tile;
else tile;;
但我收到一个语法错误:
Error: Syntax error
Characters 597-601:
else tile;;
^^^^
(拼图示例:let puzzle1={mat=[|[|'1';'2';'3'|];[|'4';'5';'6'|];[|'7';'8';'9'|]|]; row=3; column=3};;
)
如何解决这个问题?
解决方法
问题出在 ;
分支中的尾随 then
,这是最小化示例(在名为 ocaml
的 OCaml 顶层运行)
# if true then print_endline "truth is true"; else print_endline "oops";;
Line 1,characters 44-48:
1 | if true then print_endline "truth is true"; else print_endline "oops";;
^^^^
Error: Syntax error
#
正确的语法是
# if true then print_endline "truth is true" else print_endline "oops";;
truth is true
- : unit = ()
但这还不是全部。如果您想在 ;
的任一分支中使用 if
连接多个表达式,您必须用括号分隔它们((
和 )
或 begin
和 end
,它们的工作方式相同),例如,
# if true then print_endline "truth is true"; print_endline "I say!" else print_endline "oops";;
Line 1,characters 67-71:
1 | if true then print_endline "truth is true"; print_endline "I say!" else print_endline "oops";;
^^^^
Error: Syntax error
这里的问题是 if
表达式的优先级高于 ;
,因此它将其拆分为三个表达式:
if true then print_endline "truth is true"
print_endline "I say!"
else print_endline "oops"
最后一部分显然不是句法上有效的表达式。
正确的语法是,
# if true then (print_endline "truth is true"; print_endline "I say!") else print_endline "oops";;
truth is true
I say!
既然我们在这里,我想警告你一个 OCaml 警告。想象下面的表达式
if false then print_endline "you will never"; print_endline "see this!"
您可能认为它不会打印任何内容,但是,
# if false then print_endline "you will never"; print_endline "see this!";;
see this!
- : unit = ()
又是这样,因为 if
比排序运算符 ;
绑定得更紧密。因此我们有两个表达式,
1. `if false then print_endline "you will never"`;
2. `print_endline "see this!"`
The first one is predicated and will never print anything,but the second is unconditional.
To summarize,if you have `;` inside your `if` expressions,always delimit them with parentheses (I prefer `begin/end`). Even better,try to employ functional style,so that you don't even need to ever use `;` in your code. OCaml is functional language and works much better with pure code.
[1]: https://ocaml.org/manual/expr.html#ss:precedence-and-associativity
The root of the problem is that `;` breaks the `if` expression is it has hi
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。