我正在编写一个函数,如果我在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
)它应该只返回新的板。如果我还有需要更改的部分,我退出此功能并返回查找该部分中的位置,以便我可以返回并切换它们。如果我仍然有一个部分和剩余的点,我会继续通过这个功能,直到所有的点都改变。
答案 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)
}
}
是否同时清空。虽然其中一个可能是空的而另一个至少有一个元素。
尝试以更模块化的方式构建代码,使不可能的状态无法代表。很可能你的代码可以被重构,以避免只有一个列表为空的情况,如果两个中的一个可能发生:两个列表都是空的或两者都至少有一个元素。