Matrix 如何在相同条件下执行多个操作?
我想对矩阵的选定元素及其相邻元素求反。 我的问题是如何在没有“&&”的情况下实现这些多个表达式。我不太懂语法。 我越来越- 错误:此表达式的类型为unit,但应为bool类型的表达式Matrix 如何在相同条件下执行多个操作?,matrix,boolean,ocaml,Matrix,Boolean,Ocaml,我想对矩阵的选定元素及其相邻元素求反。 我的问题是如何在没有“&&”的情况下实现这些多个表达式。我不太懂语法。 我越来越- 错误:此表达式的类型为unit,但应为bool类型的表达式 let matrix2 =[|[|true;true;false;false|]; [|false;false;true;true|]; [|true;false;true;false|]; [|true;false;f
let matrix2 =[|[|true;true;false;false|];
[|false;false;true;true|];
[|true;false;true;false|];
[|true;false;false;true|]|];;
let flip_matrix matrix a b=
let n=Array.length matrix in
for i=1 to n do
let n1=Array.length matrix in
for j=1 to n1 do
if i=a && j=b
then
matrix.(i).(j)<- not matrix.(i).(j)&&matrix.(i+1).(j+1)<- not matrix.(i+1).(j+1)&&matrix.(i-1).(j-1)<- not matrix.(i-1).(j-1)
done;
done;
matrix;;
flip_matrix matrix2 1 2;;
让matrix2=[|[|真;真;假;假|];
[假;假;真;真];
[真;假;真;假];
[真;假;假;真];;
让我们翻转矩阵a和b=
设n=Array.length矩阵in
对于i=1到n do
设n1=数组中的数组长度矩阵
对于j=1到n1 do
如果i=a&&j=b
然后
矩阵。(i)。(j)数组的变异赋值计算为单位:
utop # let arr = Array.make 10 0;;
val arr : int array = [|0; 0; 0; 0; 0; 0; 0; 0; 0; 0|]
utop # arr.(0) <- 1;;
- : unit = ()
utop#让arr=Array.make 10 0;;
val-arr:int数组=[|0;0;0;0;0;0;0;0 |]
utop#arr.(0)我认为应该这样做:
let matrix33 = [|[|true;true;false;false|];
[|false;false;true;true|];
[|true;false;true;false|];
[|true;false;false;true|]|];;
let flip_matrix matrix a b=
let n=Array.length matrix in
for i=1 to n do
let n1=Array.length matrix in
for j=1 to n1 do
if i=a && j=b
then begin
matrix.(i).(j)<- not matrix.(i).(j);
matrix.(i+1).(j)<- not matrix.(i+1).(j);
matrix.(i).(j+1)<- not matrix.(i).(j+1);
matrix.(i).(j-1)<- not matrix.(i).(j-1);
matrix.(i-1).(j)<- not matrix.(i-1).(j);
end;
done;
done;
matrix;;
flip_matrix matrix33 1 1 ;;```
让matrix33=[|[|真;真;假;假|];
[假;假;真;真];
[真;假;真;假];
[真;假;假;真];;
让我们翻转矩阵a和b=
设n=Array.length矩阵in
对于i=1到n do
设n1=数组中的数组长度矩阵
对于j=1到n1 do
如果i=a&&j=b
然后开始
矩阵。(i)。(j)排序运算符代码>用于将多个表达式链接在一起
<exp1>; <exp2>
注意,
仅适用于返回类型为unit
的值的表达式,即仅对其副作用进行评估且不产生任何有用值的表达式
当需要链接多个产生有用值的表达式时,需要将这些值绑定到一些变量,并且必须使用let=in
。此表达式将计算
,并将其绑定到变量
,该变量可用于表达式
,然后进行计算。例如
let message = "hello", ^ ", world" in
print_endline message
如您所见,
只是一种简写符号
let () = <exp1> in <exp2>
现在,我们已经准备好使用条件表达式,例如if
。我们很自然地会认为
if x > 0 then print_endline "Hello"; print_endline "World"
将打印
Hello
World
如果x
大于零。但这是错误的!正如我最近在这篇文章中所描述的,if
表达式的优先级(priority)高于代码>,因此实际上OCaml解析器将其拆分为两个表达式:
(if x > 0 then print_endline "Hello"); print_endline "World"
因此,在最后,只有一个表达式处于条件下。与往常一样,在此类优先问题中,解决方案是使用括号(或开始/结束
,两者相同),例如
您还可以使用更通用的let。。在..
中,如果您愿意,它可以在没有任何额外括号的情况下工作,例如
if x > 0 then
let () = print_endline "Hello" in
print_endline "World"
>一旦你对自己的问题有了一个坚实的理解,无论你找到什么答案都有助于解决问题,请考虑编辑问题标题。我认为您实际遇到的问题与没有任何关系(如果:)您说得对,我编辑了它。希望现在更清楚。啊,是的。这让你问的问题更清楚了。在ocaml中,&&&
是一个布尔运算符,它接受两个布尔值并返回一个新值。要对语句进行排序,可以将它们与交错代码>,如您所识别:)
(if x > 0 then print_endline "Hello"); print_endline "World"
if x > 0 then (print_endline "Hello"; print_endline "World")
if x > 0 then
let () = print_endline "Hello" in
print_endline "World"