Function Prelude.head:if语句中的空列表
我正在编写一个函数,如果我使用变量Function Prelude.head:if语句中的空列表,function,haskell,if-statement,runtime-error,empty-list,Function,Haskell,If Statement,Runtime Error,Empty List,我正在编写一个函数,如果我使用变量newBoard,它将抛出Prelude.head空列表,如果我在if-else中使用sortBoard,它将抛出此错误。如果我使用原始board字符,它不会抛出此错误 foo :: [[Char]] -> [(Int, Int)] -> [(Int, (Int, Int))] -> Int -> [(Int,Int)]-> [Int]-> [[Char]] foo [] _ _ _ _ _ = [] foo board []
newBoard
,它将抛出Prelude.head空列表,如果我在if-else中使用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)
为了解释这段代码,我有一个游戏板,需要在变量spot
给出的某些点中输入“1”。如果我已经通过了所有的点(tailSpot
),并且没有更多的部分我需要更改(move
),它应该只返回新的板。如果我仍有需要更改的部分,我将退出此功能并返回到该部分中查找点,以便返回并切换它们。如果我还有一个部分和斑点,我会继续执行此功能,直到所有斑点都被更改。问题在于:
newBoard = set board (head spot) ('1')
您正在呼叫spot
列表中的head
。但是,spot
可能是空列表。您的模式匹配不够详尽。在这里foo board[]\uuu\uuu[]=board
检查spot
和move
是否同时为空。其中一个可能为空,而另一个至少有一个元素
尝试以更模块化的方式构造代码,使不可能的状态不可表示。如果两个列表中都有一个是空的,或者两个列表都至少有一个元素,则最有可能对代码进行重构,以避免出现只有一个列表为空的情况。使用head
和tail
本身就是危险的,而且很少需要-我会尽可能合理地避免它们。将它们替换为模式匹配,并使用-Wall
打开警告,以便GHC可以就遗漏的案例发出警告。您知道如何使其详尽无遗?我试着用fooboard[].\uuuuu=sortBoard…
和另一个foodboard[]=board
进行模式匹配,但它说模式匹配是多余的。我已经看了这段代码好几天了,什么都想不出来。@JessSmith尝试一下这组模式<代码>ghc
不会在此处警告我冗余模式匹配