Algorithm F#错误和合并排序

Algorithm F#错误和合并排序,algorithm,recursion,merge,f#,Algorithm,Recursion,Merge,F#,我正在用F#编写一个mergesort函数,但是我收到了这个错误代码,我不明白为什么 错误FS0030:值限制。已推断值“it”具有泛型类型 val it:“\u a:比较时添加列表” 将“it”定义为简单的数据项,使其成为具有显式参数的函数,或者,如果不希望它是泛型的,则添加类型注释。” 当我尝试调用mergesort[1;2;3;3;2;6];时,我会得到错误代码 下面是代码片段 let rec merge l = match l with | ([], ys) -> ys

我正在用F#编写一个mergesort函数,但是我收到了这个错误代码,我不明白为什么

错误FS0030:值限制。已推断值“it”具有泛型类型 val it:“\u a:比较时添加列表” 将“it”定义为简单的数据项,使其成为具有显式参数的函数,或者,如果不希望它是泛型的,则添加类型注释。”

当我尝试调用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)
让rec合并l=
匹配
|([],ys)->ys
|(xs,[])->xs
|(x::xs,y::ys)->如果x ([], [])
|[a]->([a],])
|a::b::cs->let(M,N)=拆分cs
(a::M,b::N)
让rec合并排序=
匹配
| [] -> []
|L->让(M,N)=拆分L
合并(合并排序M、合并排序N)

在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显示错误的错误消息。似乎就是这种情况之一。

对我来说,代码编译得很好,尽管
mergesort
中似乎有一个小错误导致堆栈溢出。通过修复它,似乎可以修复FSI问题。FSI偶尔会报告错误错误,似乎这是其中之一。啊,为什么FSI和VS2015之间存在差异?非常感谢您的帮助