2つの ST s の s が同じであることを明示する方法はありますか?
次のコードにおいて型検査時に、go = readArray array
で、その次の行のコメントのようなエラーが出ました。
エラーの原因としては、2つの ST
の(片方は STArray
ですが)内部状態の s
と s1
が別物だと認識されていることと考えています。
この s
と s1
が同じであると明記することはできますか?
または、この形式だと根本的に s
と s1
は別物になるべきでしょうか?
ちなみに go
のシグネチャを変更したコメントアウトした版にすると s
が同じことが明記できるので型検査が通ります。
#!/usr/bin/env stack
-- stack --resolver lts-9.14 --install-ghc runghc --package array
import Control.Monad.ST
import Data.Array.ST
main = print $ runST $ do
array <- newArray (0, 1 :: Int) (0 :: Int) :: ST s (STArray s Int Int)
let
go :: Int -> ST s Int
go = readArray array
-- starray.hs:11:14: error:
-- • No instance for (MArray (STArray s) Int (ST s1))
-- arising from a use of ‘readArray
-- go :: STArray s Int Int -> Int -> ST s Int
-- go = readArray
writeArray array 1 1
go 1
-- go array 1