Ограничение значения в F#
У меня есть назначение F#, где я пытаюсь вычислить транспонирование матрицы. Достаточно просто, но я продолжаю получать ошибку ограничения значения и не могу понять, почему. Я справился со многими вопросами об ошибках VR, которые есть, но я все еще в неведении. Вот мой код:
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. Может ли кто-нибудь уточнить, что здесь происходит?
1 ответ
Я думаю, вы изначально написали это let rec transpose zs = match zs with ...
а потом поменял его на использование function
вместо этого, что устраняет необходимость явного аргумента. поскольку zs
все еще там, ваша функция принимает два аргумента, что означает, что вы применяете ее только частично. поскольку zs
не используется, его тип неизвестен, поэтому ваша частично примененная функция возвращает значение универсальной функции (ограничение значения). Удалить zs
и все хорошо.