簡體   English   中英

ST樣封裝

[英]ST-like encapsulation

我正在嘗試使用類型系統來確保 X 永遠不會從 monad M 中取出。我希望它的工作方式類似於runST ,其中不可能混合來自不同線程的環境。

data X s = X Int
type M s = State Int

newX :: M s (X s)
newX = X <$> get

eval :: (forall s. M s a) -> a
eval x = evalState x 0

但是,以下代碼不會導致類型錯誤:

ghci> x = eval newX
ghci> :t x
x :: X s

為什么 ST monad 中的類似代碼會拋出錯誤而我的不會? 據我了解的sM sa應該成為約束,使得sX s游離型變量,從而引起類型檢查錯誤。

要強制類型抽象,您必須使用datanewtype ,而不是type

type同義詞中未使用的參數根本不起作用:

type M s = State Int

所以這些是等價的:

newX :: M s (X s)
newX :: State Int (X s)

eval :: (forall s. M s a) -> a
eval :: State Int a -> a

eval實際上並不是更高級別的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM