我正在用 Haskell 编写数独生成器/求解器作为学习练习。
我的solve
函数接受 aUArray
但返回 aState Int (UArray ...)
以便它还可以返回它在解决时找到的最大难度级别。
到目前为止,这是我的功能(仍处于非常实验性的早期阶段):
import Control.Monad.State (State, put)
import Control.Monad.Trans.Class (lift)
import Data.Array.MArray (thaw)
import Data.Array.ST (runSTUArray)
import Data.Array.Unboxed (UArray)
-- ...
type Cell = Word16
solve :: UArray (Int, Int) Cell -> State Int (UArray (Int, Int) Cell)
solve grid = do
return $ runSTUArray $ do
arr <- thaw grid
lift $ put 42
return arr
它还没有真正对可变数组做任何事情。我只是想让它使用 进行类型检查put 42
,但目前收到以下错误:
• Couldn't match kind ‘*’ with ‘* -> *’
When matching the kind of ‘ST’
• In a stmt of a 'do' block: lift $ put 42
In the second argument of ‘($)’, namely
‘do arr <- thaw grid
lift $ put 42
return arr’
In the second argument of ‘($)’, namely
‘runSTUArray
$ do arr <- thaw grid
lift $ put 42
return arr’
|
128 | lift $ put 42
| ^^^^^^^^^^^^^