【发布时间】:2012-09-22 04:11:19
【问题描述】:
我在 List 上有一个非常简单的 MergeSort 实现。
/// Divide the list into (almost) equal halves
let rec split = function
| [] -> [], []
| [x] -> [x], []
| x1::x2::xs -> let xs1, xs2 = split xs
x1::xs1, x2::xs2
/// Merge two sorted lists
let rec merge xs ys =
match xs, ys with
| [], _ -> ys
| _, [] -> xs
| x::xs', y::ys' when x <= y -> x::merge xs' ys
| _, y::ys' -> y::merge xs ys'
let rec mergeSort = function
| [] -> []
| xs -> let xs1, xs2 = split xs
merge (mergeSort xs1) (mergeSort xs2)
但每当我尝试使用 F# Interactive 中的任何输入进行测试时:
let xs = mergeSort [1;4;3;2];;
遇到值限制错误:
错误 FS0030:值限制。值“xs”已被推断为 有泛型类型 val xs : '_a list when '_a : comparison 将 'xs' 定义为一个简单的数据项,使其成为具有显式参数的函数,或者,如果 你不打算让它是通用的,添加一个类型注释。
为什么会这样?有什么简单的修复方法?
【问题讨论】:
-
当我将代码粘贴到
FSI时,F# 2.0 Interactive build 2.0.0.0上没有收到任何错误消息 -
@JohnPalmer:当然不是。尝试在某些输入上执行函数。
-
@PaoloFalabella:谢谢,我知道这篇文章。我只是不明白为什么会发生这种情况。
标签: f# mergesort value-restriction