我有这个小函数:
let switch matrix =
for i = 0 to Array.length matrix - 1 do
for j = 0 to Array.length (Array.get matrix i) - 1 do
if Array.get (Array.get matrix i) j = false then
Array.set (Array.get matrix i) j true
done
done;;
基本上将矩阵中的所有假值翻转为真值。这不是我真正想要的,这只是为了说明我到目前为止所做的尝试。
问题是这个函数改变了矩阵的值,而不是创建一个矩阵。
我需要它是bool数组数组->Bool array array =
我需要做什么才能有一个这样做的函数
我想到了模式匹配,所以我试过:
let switch matrix =
for i = 0 to Array.length matrix - 1 do
for j = 0 to Array.length (Array.get matrix i) - 1 do
match Array.get (Array.get matrix i) j with true -> true | false -> true
done
done;;
但是这个函数说:他的表达式应该是unit类型的
抱歉,如果这是一个愚蠢的问题,我只是开始与OCaml
编辑:所以,我试了这个:
let switch matrix =
let newMatrix =
Array.make_matrix (Array.length matrix)
(Array.length (Array.get matrix 1))
true
in
let switching matrixes = matrixes.(0).(0) <- false in
switching newMatrix;
newMatrix;;
但是现在,它的类型是数组array ->Bool array array =。但我需要它是bool数组数组->Bool array数组。我该怎么做才能走出困境?
如果你有一个布尔值的矩阵,并且想要将假值翻转为真,那么你总是会得到一个全是真值的矩阵。
这大大简化了你的代码。
let switch matrix =
Array.(
let height = length matrix in
let width = length matrix.(0) in
make_matrix width height true
)
如果你的目标是将真变为假,假变为真:
let switch matrix =
Array.(
map (map not) matrix
)
编辑后的解决方案很好。您只需要将第一个函数(修改矩阵的函数)应用于您创建的新矩阵。
从第一段代码开始:
let switch matrix = for i = 0 to (Array.length matrix - 1) do
for j = 0 to ((Array.length (Array.get matrix i ))-1) do
if Array.get (Array.get matrix i) j = false then Array.set (Array.get matrix i) j true
done;
done;
正确格式化并对Array.get
Array.set
使用.()
和.() <-
运算符:
let switch matrix =
for i = 0 to Array.length matrix - 1 do
for j = 0 to Array.length matrix.(i) - 1 do
if not matrix.(i).(j) then matrix.(i).(j) <- true
done
done
if expr = true
等价于if expr
,if expr = false
等价于if not expr
true
,根据matrix
修改它并返回它,我们得到:
let switch matrix =
let n = Array.length matrix in
let p = Array.length (matrix.(0)) in
let result = Array.make_matrix n p true in
for i = 0 to n - 1 do
for j = 0 to p - 1 do
if matrix.(i).(j) then result.(i).(j) <- false
done
done;
result