我试图在F#中实现合并排序,因为我正在尝试学习函数式编程。但是我遇到了这个辅助功能合并的问题。希望有人能指出我正确的方向。请记住,我对F#只有基本的了解。
let rec merge a b =
match a, b with
|q, [] -> q
|[], p -> p
|q::q', p::p' when q<p -> q::merge q' p::p'
|q::q', p::p' when p<q -> p::merge q::q' p';;
merge [1;3;5;7;9] [2;4;6;8;10];;
控制台输出:
Uge2.fsx(96,34): error FS0001: Type mismatch. Expecting a
'a
but given a
'a list
The resulting type would be infinite when unifying ''a' and ''a list'
>
Uge2.fsx(99,1): error FS0039: The value or constructor 'merge' is not defined
有关代码的任何建议都非常受欢迎。谢谢你的帮助!
答案 0 :(得分:4)
q :: merge q' p :: p'
被理解为(q :: (merge q' p)) :: p'
这意味着p
类型必须同时为'a
(某些内容)和'a list
(这些内容的列表)
你真正想要的是q :: merge q' (p :: p')
或者看到p :: p'
是b
您可以重写q :: merge q' b