![](/img/trans.png)
[英]Can a `ST`-like monad be executed purely (without the `ST` library)?
[英]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 中的類似代碼會拋出錯誤而我的不會? 據我了解的s
在M sa
應該成為約束,使得s
在X s
游離型變量,從而引起類型檢查錯誤。
要強制類型抽象,您必須使用data
或newtype
,而不是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.