学習課題として、Haskell で Sudoku ジェネレーター/ソルバーを作成しています。
私のsolve
関数は a を受け取りますが、解決中に見つかった最大難易度も返すことができるように a をUArray
返します。State 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
| ^^^^^^^^^^^^^