さて、Haskellで数独ソルバーを作成しようとしていますが、期待されるタイプ[[Int]]を実際のタイプIO()と一致させることができなかったというエラーが表示されます。再帰ソルバー、エラーメッセージ、およびその他の関連するコードでの私の試みは次のとおりです。
再帰的ソルバーの試み:
test i j q s_board = if ((valid_row i q s_board )&&(valid_column j q s_board)&& (valid_sub_board i j q s_board)) then (solve (set_value i j q s_board)) else s_board
foo i j s_board = if ((get_value i j s_board) == 0) then [test i j q s_board | q <- [1..9]] else s_board
solve s_board = if (full_board s_board) then (print_board s_board) else [foo i j s_board | i <- [0..8], j <- [0..8]]
有効な列、行などの関数のすべての定義を含めると、この質問は非常に長くなりますが、それらが機能することを確認しました。このコードでは、次のエラーメッセージが表示されます。
Couldn't match expected type `[[Int]]' with actual type `IO ()'
In the return type of a call of `print_board'
In the expression: (print_board s_board)
In the expression:
if (full_board s_board) then
(print_board s_board)
else
[foo i j s_board | i <- [0 .. 8], j <- [0 .. 8]]
また、ボードの印刷に使用しているコードは次のとおりです。
-- showLine: this function provides formating for a single row
showLine :: [Int] -> String
showLine = intercalate " | "
. map unwords
. chunksOf 3
. map show
-- showBoad: this function provides formating for the entire board
showBoard :: [[Int]] -> String
showBoard = intercalate "---------------------\n"
. map unlines
. chunksOf 3
. map showLine
-- print_board: this function is meant to print out the entire board
print_board :: [[Int]] -> IO ()
print_board s_board = putStrLn $ showBoard s_board
私がこれまでに持っているものの何が問題なのか分かりますか?私はHaskellにまったく慣れていません。これは、私が試した最初の実際のプログラムです。どんな助けでも大歓迎です。