Я пишу генератор/решатель судоку на Haskell в качестве учебного упражнения.
Моя функция solve
принимает 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
| ^^^^^^^^^^^^^
ST
не встроена в преобразовательStateT
, поэтому операциюput
нельзя поднять. - person Ralph   schedule 18.03.2018