2014-02-14 140 views
0

我正在從http://www.cse.chalmers.se/edu/year/2013/course/TDA555/lab3.html開始製作Sudoku求解器的分步練習。在這裏,我試圖表達的行,列和箱約束條件Sudok應用列表中的函數列表

data Sudoku = Sudoku { getSudoku :: [[Maybe Int]] } deriving (Show, Eq) 

rows :: Sudoku -> [[Maybe Int]] 
rows (Sudoku rs) = rs 

columns :: Sudoku -> [[Maybe Int]] 
columns = transpose . rows 

boxes :: Sudoku -> [[Maybe Int]] 
boxes s = a ++ b ++ c 
    where a = map (concat . take 3) s1 
      b = map (concat . take 3 . drop 3) s1 
      c = map (concat . drop 6) s1 
      s1 = transpose . map (\xs -> [take 3 xs,take 3 (drop 3 xs), drop 6 xs]) $ rows s 

我設法得到它的工作,但我想重構應用S1上的3個功能得到A,B,C成一個列表。我嘗試了< *>但不知何故無法讓它工作。由於

回答

3

則可以使用Applicative如果你真的

boxes2 s = concat $ [a,b,c] <*> [s1] 

這只是一樣

concatMap ($s1) [a,b,c] 

或者寫,你可以這樣做:

boxes3 :: Sudoku -> [[Maybe Int]] 
boxes3 = map concat . concat . map (f . transpose) . f . getSudoku 
    where f = unfoldr (\x -> if null x then Nothing else Just $ splitAt 3 x)