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
不会在此处警告我冗余模式匹配