2014-10-09 5 views
1
data Sudoku = Sudoku [[Maybe Int]] 

blank :: Sudoku -> Pos 
blank (Sudoku rs) = [(y,x) | (r,y) <- rs `zip` [0..8], (c,x) <- r `zip` [0..8], c == Nothing] !! 0 

공백은 Nothing 인 첫 번째 위치를 반환합니다. Nothing이 아닌 경우 오류가 아닌 합당한 것을 반환하고 싶습니다. 내가 어떻게 할 수 있니?목록에서 위치를 반환하는 데 필요한 기초가 필요합니다.

출력 :

Main> blank example 
(0,2) 

Main> blank sud 
*** Exception: Prelude.(!!): index too large 

이 (SUD 아무 것도 포함되어 있지 않습니다)

example = 
    Sudoku 
     [ [Just 3, Just 6, Nothing, Nothing, Just 7, Just 0, Just 2, Nothing, Nothing] 
     , [Nothing, Just 5, Nothing, Nothing, Nothing, Nothing, Just 1, Just 8, Nothing] 
     , [Nothing, Nothing, Just 9, Just 2, Nothing, Just 4, Just 7, Nothing, Nothing] 
     , [Nothing, Nothing, Nothing, Nothing, Just 1, Just 3, Nothing, Just 2, Just 8 ] 
     , [Just 4, Nothing, Nothing, Just 5, Nothing, Just 2, Nothing, Nothing, Just 9 ] 
     , [Just 2, Just 7, Nothing, Just 4, Just 6, Nothing, Nothing, Nothing, Nothing] 
     , [Nothing, Nothing, Just 5, Just 3, Nothing, Just 8, Just 9, Nothing, Nothing] 
     , [Nothing, Just 8, Just 3, Nothing, Nothing, Nothing, Nothing, Just 6, Nothing] 
     , [Nothing, Nothing, Just 7, Just 6, Just 9, Nothing, Nothing, Just 4, Just 3 ] 
     ] 
+0

아마도 예상되는 출력 결과를 입력에 추가 할 수 있습니까? – Sibi

+5

어쩌면 Pos?를 대신 반환하는 것은 어떻습니까? – MathematicalOrchid

+0

정보를 추가했습니다. 아니요, 과제는 제가 포지션을 돌려줘야한다고 말합니다 .. – Josu24

답변

2

(!! 0)head,하지만 당신이이 여부를 확인해야하므로 head 만, 비어 있지 않은 목록에서 작동 케이스 :

blank :: Sudoku -> Pos 
blank (Sudoku rs) = case [(y,x) | (r,y) <- rs `zip` [0..8] 
           , (c,x) <- r `zip` [0..8] 
           , c == Nothing] 
        of (pos:_) -> pos; _ -> (-1, -1) 

물론 이것은별로 좋지 않습니다. 아마도 Maybe (즉, Just (y,x) 또는 Nothing)로 싸인 위치를 반환해야 함수의 유형이 blank :: Sudoku -> Maybe Pos으로 변경됩니다. 그런 다음 Data.Maybe에서 내장 함수 listToMaybe을 사용하여 얻을 :

 
Prelude> :m +Data.Maybe 
Prelude Data.Maybe> listToMaybe [1..5] 
Just 1 
Prelude Data.Maybe> listToMaybe [] 
Nothing 

그래서

blankMaybe :: Sudoku -> Maybe Pos 
blankMaybe (Sudoku rs) = listToMaybe [(y,x) | (r,y) <- rs `zip` [0..8] 
              , (c,x) <- r `zip` [0..8] 
              , c == Nothing] 

아니면 blankHead :: Sudoku -> [Pos]; blankHead (Sudoku rs) = take 1 [(y,x) | ..... ]take 1 대신 head, 사용할 수 있습니다. 그러나 Maybe을 사용하는 것이 최선의 선택입니다. 그 유형이 여기에있는 의도와 정확하게 일치하기 때문입니다.