2017-04-02 8 views
1

변수를 사용하는 경우 newBoard 변수를 사용하는 경우 Prelude.head empty list을 던집니다.이 경우 sortBoard은 if-else에서이 오류를 발생시킵니다. 원래 board 문자를 사용하면이 오류가 발생하지 않습니다. Prelude.head : if 문에서 빈 목록

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) 

이 코드에 explination 위해, 나는 게임 보드를 가지고 입력해야하는 '1'변수 spot에 의해 주어진 특정 지점에서. 모든 지점 ( tailSpot)을 통과했으며 더 이상 섹션이 없으면 ( move) 변경해야합니다. 새 보드를 반환해야합니다. 변경해야 할 섹션이 아직 남아있는 경우이 기능을 종료하고 해당 섹션의 지점을 찾아 돌아가서 되돌릴 수 있습니다. 섹션과 스폿이 남아있는 경우 모든 스팟이 변경 될 때까지이 기능을 계속 사용합니다.

+2

'head'와'tail'을 사용하는 것은 본질적으로 위험하며, 거의 필요하지 않습니다. 가능한 한 많이 피해야합니다. 그것들을 패턴 일치로 바꾸고'-Wall'로 경고를 켜서 GHC가 놓친 경우에 대해 경고 할 수있게하십시오. – chi

답변

1

문제는 여기에 있습니다 : 당신은 spot 목록 head 전화하는거야

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

. 그러나 spot은 빈 목록 일 수 있습니다. 패턴 매칭은 충분하지 않습니다. 여기 foo board [] _ _ _ [] = boardspotmove이 동시에 비어 있는지 확인하십시오. 하나는 비어 있고 다른 하나는 적어도 하나의 요소를 가질 수 있습니다.

더 많은 모듈 방식으로 코드를 구조화하여 주저 할 수없는 상태를 설명 할 수 없게 만듭니다. 대부분의 경우 코드가 리팩토링되어 하나의 목록 만 비어있는 상황 (두 목록 중 하나가 비어있는 경우)을 피할 수 있습니다. 두 목록이 모두 비어 있거나 둘 다 하나 이상의 요소가 있습니다.

+0

내가 어떻게 완성 할 수 있는지 아십니까? 나는'foo board [] _ ​​_ _ _ = sortBoard ... '와 또 다른'food board _ _ _ _ [] = board'와 일치하는 패턴을 만들려고했으나 패턴 일치가 중복되었다고 말했습니다. 며칠 동안이 코드를 살펴 봤는데 아무 것도 생각 나지 않았습니다. –

+0

@JessSmith이 패턴 세트를 시도하십시오. 'ghc'는 중복 패턴 매치에 대해 경고하지 않습니다. http://lpaste.net/1351820791544545280 – Shersh