Ограничение значения в F #

У меня есть задание 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. Не мог бы кто-нибудь прояснить, что здесь происходит?


person user991710    schedule 11.02.2013    source источник
comment
Какая школа дает вам задание по F # из любопытства?   -  person Asik    schedule 12.02.2013


Ответы (1)


Я предполагаю, что вы изначально написали это let rec transpose zs = match zs with ..., а позже изменили его, чтобы вместо него использовать function, что устраняет необходимость в явном аргументе. Поскольку zs все еще существует, ваша функция принимает два аргумента, что означает, что вы применяете ее лишь частично. Поскольку zs не используется, его тип неизвестен, поэтому ваша частично примененная функция возвращает универсальную функцию value (ограничение значения). Удалите zs, и все будет хорошо.

person Daniel    schedule 11.02.2013
comment
Мои извинения за поздний комментарий: К сожалению, это не помогло решить проблему, и ошибка ограничения значения остается. Я сделал начальную функцию нерекурсивной, поскольку увидел, что в этом тоже нет необходимости. Приведение его (возможно, к списку int list) тоже не работает. - person user991710; 11.02.2013
comment
Я добавил рабочую версию кода с использованием шаблона match ... with ..., но я не уверен, почему он работает в первую очередь, когда я все еще получаю предупреждение о типах . Буду очень признателен, если вы внесете ясность! - person user991710; 11.02.2013
comment
После редактирования обе ваши transpose функции эквивалентны и работают. Последнюю ошибку можно исправить, привязав результат с помощью let или пропустив конвейер для игнорирования (|> ignore). - person Daniel; 11.02.2013
comment
Спасибо за ваше обращение. - person user991710; 11.02.2013