Prelude.head:if语句中的空列表

时间:2017-04-02 20:11:48

标签: function haskell if-statement runtime-error empty-list

我正在编写一个函数,如果我在if-else中使用变量Prelude.head empty list newBoard,则抛出sortBoard会抛出此错误。如果我使用原始board字符,则不会抛出此错误。

foo :: [[Char]] -> [(Int, Int)] -> [(Int, (Int, Int))] -> Int -> [(Int,Int)]-> [Int]-> [[Char]]
foo [] _ _ _ _ _ = []
foo board [] _ _ _ [] = board
foo board spot array number startArray move = nextStep
    where 
        newBoard        = set board (head spot) ('1')
        tailSpot        = tail spot
        nextStep = 
            if tailSpot == []
                then if (tail move) == []
                        then newBoard
                    else sortBoard newBoard array 1 [] (tail move)
            else (foo newBoard tailSpot array 1 [] move)

有关此代码的探索,我有一个游戏板,需要输入' 1'在由变量spot给出的某些点中。如果我已经浏览了所有的点(tailSpot)并且没有更多的部分我需要更改(move)它应该只返回新的板。如果我还有需要更改的部分,我退出此功能并返回查找该部分中的位置,以便我可以返回并切换它们。如果我仍然有一个部分和剩余的点,我会继续通过这个功能,直到所有的点都改变。

1 个答案:

答案 0 :(得分:1)

问题出在这里:

newBoard        = set board (head spot) ('1')

您正在head列表中呼叫spot。但spot可能是空列表。您的模式匹配不够详尽。在foo board [] _ _ _ [] = board spot,您检查move class MySlashHandler() extends Actor { def receive = { case ctxt: ContextOfSomeKind => decodeRequest { // unmarshal with in-scope unmarshaller entity(as[Order]) { order => sender ! "Order received" } context.stop(self) } } val route = pathEndOrSingleSlash { get { ctxt => val actor = actorSystem.actorOf(Props(classOf[MySlashHandler])) complete(actor ? ctxt) } } 是否同时清空。虽然其中一个可能是空的而另一个至少有一个元素。

尝试以更模块化的方式构建代码,使不可能的状态无法代表。很可能你的代码可以被重构,以避免只有一个列表为空的情况,如果两个中的一个可能发生:两个列表都是空的或两者都至少有一个元素。