【问题标题】:parsing error on guards警卫上的解析错误
【发布时间】:2014-07-01 18:46:41
【问题描述】:

我正在实现归并排序的归并子程序。编译时收到此错误消息:输入时解析错误 |

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)

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

【问题讨论】:

  • go xs ys zs 之后你有一个额外的= - 当用警卫定义某些东西时,= 只出现在每个警卫之后,就像你已经拥有的那样。

标签: parsing sorting haskell merge


【解决方案1】:

您可以通过删除 go xs ys zs 之后的 = 来修复语法错误 - 当使用守卫定义某些内容时,= 仅出现在每个守卫之后,就像您已经拥有的那样。

除此之外,如果您更多地使用模式匹配,您的代码会更简洁。您可以使用模式[] 来识别空列表和(x:xs) 来识别非空列表并绑定头部,而不是使用null 检查列表是否存在并尾随名称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)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-09-28
    • 1970-01-01
    • 2017-05-08
    • 2015-02-24
    • 1970-01-01
    • 2016-03-25
    • 1970-01-01
    相关资源
    最近更新 更多