Matrix 如何在相同条件下执行多个操作?

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

我想对矩阵的选定元素及其相邻元素求反。 我的问题是如何在没有“&&”的情况下实现这些多个表达式。我不太懂语法。 我越来越- 错误:此表达式的类型为unit,但应为bool类型的表达式

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"