2017-04-13 72 views
3

序言一個MonadTransformer到類型檢查了已經完成的動作

這是那些我認爲,有人已經解決了我的問題的問題之一,但我不知道去哪裏找。

問題

我要找攜帶的是這樣的單子堆棧的操作將無法進行類型檢查,除非它是完整的完全或不完全的想法MonadTransformer。

我的情況

我有一個單子與持有兆乏的狀態疊加。未能寫入此MVar將導致thread blocked indefinitely in an MVar異常。我可以檢查MVar本身,但將它交給另一個線程(遵循相同的規則)也是獲得MVar填充的有效方法(正如拋出一個錯誤)。

我正在尋找某種方式讓typechecker拋出一個錯誤,如果其中一個條件沒有被monad運行時所滿足。我可以在運行時檢查,但我認爲可能有一種使用類型系統的方法。

回答

3

聽起來像某種indexed monad可能有所幫助。索引monad允許或禁止某些類型級別的操作。


我們還可以依靠多態性

{-# language RankNTypes #-} 
import Control.Monad 
import Control.Monad.Trans.State 

-- Receives an v and returns a "proof" token 
newtype Gulp token v = Gulp (v -> IO token) 

-- Computation polymorphic on the token 
type EnsuredWrite v r = forall token. StateT (Gulp token v) IO (token,r) 

的想法是,EnsuredWrite類型的動作需要返回token值,但只知道如何通過Gulp餵養函數產生一個。如果他們回來了,他們一定會調用這個功能。

令牌的實際類型並不重要,它可以是一個簡單的()。但EnsuredWrite行動不應該知道,因此forall

雖然這個解決方案並不禁止重複寫入。

+0

不是Haskell,但很有趣:http://docs.idris-lang.org/zh/latest/st/ – danidiaz

相關問題