合并F#中的有序列表,期待一个'但给出一个' a - >一个'名单

时间:2016-09-10 14:51:05

标签: list types f# mergesort type-mismatch

我试图在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

有关代码的任何建议都非常受欢迎。谢谢你的帮助!

1 个答案:

答案 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