【发布时间】:2018-03-17 21:53:46
【问题描述】:
我正在尝试在 Haskell 中编写数独生成器/求解器作为学习练习,但在 ST monad 中生成可变数组时遇到了困难。
parse 函数的输入将是一个包含 81 个字符的 String,其中包含数字 1 到 9 和占位符(.、- 或 0)。
这是我写的函数,但它不会编译,我不知道我需要什么类型:
import Control.Monad
import Control.Monad.ST
import Data.Array.ST
import qualified Data.Array.Unboxed as U
import Data.Char (digitToInt, isDigit)
import Data.List (zip)
data Cell = Cell
{ values :: Word16
, original :: Bool
} deriving (Show)
parse input =
runSTUArray $
U.array ((0, 0), (8, 8)) $
map
(\(i, d) ->
( (quot i 9, mod i 9)
, if isDigit d && d /= '0'
then Cell {values = bit $ digitToInt d, original = True}
else Cell {values = 2 ^ 11 - 2, original = False})) $
zip [0 ..] input
函数的输出应该是包含单元格的可变 9 x 9 网格的不可变表示。
我该如何解决这个问题?
【问题讨论】:
-
拥有可变事物的不可变表示是什么意思?您寻求帮助修复的“这个”是什么?
-
您确定需要一个可变的 9 x 9 网格吗?