Haskell中List中的模式匹配失败

时间:2013-04-01 09:20:50

标签: list haskell pattern-matching

模式匹配有一个问题。当我向(x:y:ys)输入包含3个元素的列表时,拥抱会抱怨:模式匹配失败。 我猜问题就在这里

takeNearestOnes agent (y:ys) (x:nearestOnes)

因为它无法匹配包含两个元素的列表的三个元素

这是完整的代码:

takeNearestOnes agent (x:y:ys) nearestOnes
            | first == second =  takeNearestOnes agent (y:ys) (x:nearestOnes)
            | otherwise = (x:nearestOnes)
        where first=(manhattanDistance x (agentCoord agent))
              second=(manhattanDistance y (agentCoord agent)

我怎样才能克服这一点?提前致谢

2 个答案:

答案 0 :(得分:3)

takeNearestOnes agent [x] nearestOnes应该是什么结果? takeNearestOnes agent [] nearestOnes的结果应该是什么?

为这些案例编写额外的等式。

答案 1 :(得分:3)

由于你的函数是递归的并且减少了列表,你最终可能会工作到1个元素的列表,在这种情况下你的匹配将失败。你可以通过添加你的函数的另一个案例来解决这个问题,但是你觉得这个案例是合适的

这样的东西
takeNearestOnes agent [x] nearestOnes = doSomething
takeNearestOnes agent []  nearestOnes = doSomethingElse