3

学習課題として、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
     |     ^^^^^^^^^^^^^
4

3 に答える 3