1

それで、私はここ数独のボードを印刷するというこの問題に取り組んできました、そして私はほとんど終わりました、しかし私は最後のステップで立ち往生しています。だから私が持っているのは「リストのリスト」として表される数独ボードです(つまり、ボード= [[1、3、5、7、0、2、0、0、0]、[3、4、5、.. 。]、...]

次の関数を使用して、書式設定を使用して行を印刷することができました。

line i s_board = intercalate " | " . map unwords . chunksOf 3 $ map show a
             where 
               a = s_board!!i 

したがって、「ライン0ボード」のような呼び出しを行うと、「1 3 5 | 7 0 2 | 0 0 0」が得られます。これは、部分的に必要なものです。次に、「doブロック」を使用して、必要なボードを出力しようとしました。これは次のようになります。

print = do line 0 board 
        line 1 board 
        ...

これはコンパイルすらしません、そして私がこのようなことをしたとき:

print = do 
        line 0 board 
        line 1 board

適切なリストが複数回印刷されたため、かなり混乱します。ボードを完成させるために、3行ごとに「----------」などの文字列を印刷するなどの追加のフォーマットを含めるように努力したかったのですが、他のものを機能させることさえできませんまだです。これらの問題についてご協力いただければ幸いです。

4

2 に答える 2

7

doブロックを介してすべての行を印刷することを心配するよりも、ボードを取得して1つの大きな文字列を作成し、最後にそれを印刷する関数を作成する方が簡単でエレガントです。

したがって、行表示関数を単純化して、ボードの1行を取得するとします。

showLine :: [Int] -> String
showLine = intercalate " | "
         . map unwords
         . chunksOf 3
         . map show

次に、各行の文字列表現を取得して、それらをすべてまとめる必要があります。showLineこれは、コードとほとんど同じように見えます。

showBoard :: [[Int]] -> String
showBoard = intercalate "---------------------\n"
          . map unlines
          . chunksOf 3
          . map showLine

サンプルボードを使用する

-- Obviously not a valid sudoku board...
example :: [[Int]]
example = replicate 9 [ 1, 2, 3, 4, 5, 6, 7, 8, 9 ]

*Main> putStrLn $ showBoard example
1 2 3 | 4 5 6 | 7 8 9
1 2 3 | 4 5 6 | 7 8 9
1 2 3 | 4 5 6 | 7 8 9
---------------------
1 2 3 | 4 5 6 | 7 8 9
1 2 3 | 4 5 6 | 7 8 9
1 2 3 | 4 5 6 | 7 8 9
---------------------
1 2 3 | 4 5 6 | 7 8 9
1 2 3 | 4 5 6 | 7 8 9
1 2 3 | 4 5 6 | 7 8 9
于 2012-11-26T03:46:27.243 に答える
3

Haskellのレイアウト規則に違反しているため、最初の試行はコンパイルされませんでした。

line n board2つ目はリストであるため、期待どおりに機能しませんでした。したがって、 do-notationは、IOアクションの順序付けではなく、非決定性を意味します。あなたがのようなタイプを入れようとした場合

print :: IO ()

関数の上(ちなみに、print標準プレリュードで定義されており、シャドウイングに関する警告が表示されるはずです)では、タイプチェッカーが間違いを通知します。本当にこのようにボードを印刷したい場合(他の答えが示唆しているように、文字列を作成してからこの全体を印刷する方がはるかに優れています)、試してみることができます

printBoard :: IO ()
printBoard = do print $ line 0 board
                print $ line 1 board

またはボード全体を印刷するには、

printBoard = mapM_ (print . showLine) board

どこshowLineがあなたのようですprintが、インデックスが削除されています。

于 2012-11-26T03:52:22.647 に答える