У меня есть задание F #, в котором я пытаюсь вычислить транспонирование матрицы. Достаточно просто, но я продолжаю получать ошибку ограничения значения и не могу понять, почему. Я проконсультировался со многими из существующих вопросов об ошибках виртуальной реальности, но все еще в неведении. Вот мой код:
let transpose = function
| [xs ; ys] ->
let rec transpose_helper = function
| [],[] -> []
| x::xs , y::ys -> [x;y] :: transpose_helper (xs,ys)
| _ -> failwith "The matrix is not a square matrix"
transpose_helper(xs,ys)
| _ -> failwith "Incorrectly formatted input"
transpose ([[1;2;3];[2;3;4]]);;
Я предполагаю, что ошибка частично связана с пустым списком, но, похоже, ничего не помогло. Приветствуются любые указатели.
РЕДАКТИРОВАТЬ: эта следующая версия кода работает. Может ли кто-нибудь объяснить почему?
let transpose zs =
match zs with
| [xs;ys] ->
let rec transpose_helper (xs, ys) =
match (xs,ys) with
| ([],[]) -> []
| (x::xs , y::ys) -> [x;y] :: transpose_helper (xs,ys)
| _ -> failwith "The matrix is not a square matrix"
transpose_helper(xs,ys)
| _ -> failwith "Incorrectly formatted input"
transpose ([[1;2;3];[2;3;4]]);;
val transpose : zs:'a list list -> 'a list list
val it : int list list = [[1; 2]; [2; 3]; [3; 4]]
Однако компилятор по-прежнему жалуется, что приведенный выше вызов транспонирования должен иметь тип модуля, если я не привяжу его с помощью let. Не мог бы кто-нибудь прояснить, что здесь происходит?