私はHaskellを使用して今年のAdvent of Codeを解決しようとしていますが、5日目に問題に遭遇しました。ジャンプのリストの指示にジャンプし、命令セットを終了する。私はIArray
でこれを正しく実装しましたが、代わりにMArray
で再実装しようとしているので、ST
モナドの怖い世界に私を投げ込んでいます。ここでSTArrayのインデックスで型エラーが発生する
は私の正しく動作するコードです:
私は再作成してSTArray
を使用しようとし
import qualified Data.Array as A
-- sample input
day5Input :: [Int]
day5Input = [0, -1, 1032] ++ replicate 1030 [1] -- to fill the array
day5Array :: A.Array Int Int
day5Array = A.listArray (0, 1032) day5Input
p1Day5Result :: Integer
p1Day5Result = go 0 0 day5Array where
go :: Integer -> Int -> A.Array Int Int -> Integer
go c i a | i > ubound || i < lbound = c
| otherwise = let n = a A.! i
i' = i+n
n' = n+1
a' = a A.// [(i, n')]
in go (c+1) i' a'
(lbound, ubound) = A.bounds day5Array
:私はエラーを取得するしかし
import Data.Array.MArray as MA
import Data.Array.ST (STArray, runSTArray)
import Control.Monad.ST
-- sample input
day5Input :: [Int]
day5Input = [0, -1, 1032] ++ replicate 1030 [1] -- to fill the array
testMArray :: ST s (STArray s Int Int)
testMArray = MA.newListArray (0, 1032) day5Input
mStep :: ST s Integer
mStep = go 0 0 testMArray where
go :: Integer -> Int -> ST s (STArray s Int Int) -> ST s Integer
go c i arr | i > ubound || i < lbound = return c
| otherwise = do
n <- MA.readArray arr i
let i' = i+n
n' = n+1
MA.writeArray arr i n'
go (c+1) i' arr
(lbound, ubound) = (0, 1032) -- sub-question, how do I query for this
-- like I did with A.bounds above?
:
day5.hs:1091:44: error:
* Couldn't match expected type `s1' with actual type `Int'
`s1' is a rigid type variable bound by
the type signature for:
go :: forall s1.
Integer -> Int -> ST s1 (STArray s1 Int Int) -> ST s1 Integer
私のコードがthis example codeとどのように違うのか分かりません。お知らせ下さい。
「testMArray」とは何ですか? 'testMArray >> = go 0 0'などが必要です。 –
@DanielWagner 'testMArray :: ST(STArray s Int Int)'です。私は編集します。 –
@AdamSmith興味がある場合は、私も同じことをしましたが、可変ベクトルを使用しました:https://github.com/ZedPea/advent-of-code/blob/master/day05-2.hs – Zpalmtree