2016-01-30 2 views
2

Я пишу функцию mergesort в F #, но я получаю этот код ошибки, и я не понимаю, почему.F # Ошибка и Mergesort

«ошибка FS0030:. Ограничение Значение Значение„оно“было выведено иметь общий тип Вэл ей: список _a когда '_a: сравнение Либо определить„это“как простой термин данных, сделать его функция с явными аргументами или, если вы не собираетесь использовать ее в качестве общего, добавьте аннотацию типа. "

Я получаю код ошибки при попытке вызова, например, mergesort [1; 2; 3; 3; 2; 6] ;;

Вот фрагмент кода

let rec merge l = 
    match l with 
    | ([], ys) -> ys 
    | (xs, []) -> xs 
    | (x::xs, y::ys) -> if x < y then x :: merge (xs, y::ys) 
         else y :: merge (x::xs, ys) 

let rec split l = 
    match l with 
    | [] -> ([], []) 
    | [a] -> ([a], []) 
    | a::b::cs -> let (M,N) = split cs 
       (a::M, b::N) 

let rec mergesort l = 
    match l with 
    | [] -> [] 
    | L -> let (M, N) = split L 
     merge (mergesort M, mergesort N) 
+2

Для меня код компилируется нормально, хотя в 'mergesort' возникает некоторая ошибка, вызывающая stackoverflow. Исправив это, кажется, исправить проблему FSI. FSI иногда сообщает о неправильной ошибке, похоже, что это один из таких случаев. – FuleSnabel

ответ

0

Попробовал код в VS2015. Ошибка воспроизводится в FSI, но если я запускаю ее как программу, программа вылетает с StackOverflowException.

Оказывается, есть небольшая ошибка в mergesort

let rec mergesort l = 
    match l with 
    | [] 
    | [_] -> l // Without this case mergesort crashes with `StackOverflowException` 
    | L -> let (M, N) = split L 
    merge (mergesort M, mergesort N) 

Исправление этой ошибки установил ее для меня в FSI. Я заметил, что иногда FSI показывает неправильное сообщение об ошибке. Кажется, это один из тех случаев.

+0

Ahh, почему существует несоответствие между FSI и VS2015? – jqdc2224

+0

Большое вам спасибо за помощь – jqdc2224