用于检查已完成操作的 Monad 转换器

A MonadTransformer to typecheck for a completed action

序言

这是其中一个问题,我认为有人已经解决了我的问题,但我不知道去哪里找。

问题

我正在寻找一个 MonadTransformer,它带有完整或不完整的想法,使得 monad 堆栈的操作将无法进行类型检查,除非它是完整的。

我的情况

我有一个 Monad 堆栈,其状态包含一个 MVar。无法写入此 MVar 将导致 thread blocked indefinitely in an MVar 异常。我可以只检查 MVar 本身,但是将它交给另一个线程(遵循相同的规则)也是填充 MVar 的有效方法(就像抛出错误一样)。

我正在寻找某种方式让类型检查器在 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 类型的动作需要 return 一个 token 值,但只知道如何通过 Gulp 中的函数生成一个值。如果他们return,他们一定调用了那个函数。

令牌的实际类型并不重要,它可以是一个简单的()。但是 EnsuredWrite 动作不应该知道这一点,因此 forall.

不过,此解决方案并不禁止重复写入。