2014-07-01 73 views
1

我正在执行合并排序的合并子程序。编译时出现以下错误消息:输入|解析错误解析卫士的错误

merge :: [Int] -> [Int] -> [Int] 
merge xs ys = go xs ys [] 
    where go xs ys zs = 
      |null ys    = zs ++ xs      
      |null xs    = zs ++ ys       
      |(head xs) <= head ys = go (tail xs) ys (head xs : zs) 
      |otherwise   = go xs (tail ys) (head ys : zs) 

谁能告诉我为什么?还有更简洁的做法吗?谢谢。

+1

您有一个额外的'=''后去XS YS zs' - 定义与警卫东西的时候,在'='来,只有每个后卫之后,你已经有了。 –

回答

3

您可以通过在go xs ys zs之后删除=来修复语法错误 - 当定义带有警卫的东西时,=仅在每个警卫之后出现,就像您已有的。

除此之外,如果您使用更多的模式匹配,您的代码将会更清晰。相反,检查是否有null列表,然后检查headtail,你可以使用模式[]识别空列表和(x:xs)双方确定非空列表和头部和尾部结合的名称xxs等:

merge :: [Int] -> [Int] -> [Int] 
merge xs ys = go xs ys [] 
    where go xs [] zs   = zs ++ xs 
      go [] ys zs   = zs ++ ys 
      go (x:xs) (y:ys) zs 
       | x <= y   = go xs (y:ys) (x:zs) 
       | otherwise  = go (x:xs) ys (y:zs) 
+0

太棒了,谢谢! – user2069328