用于检查已完成操作的 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
.
不过,此解决方案并不禁止重复写入。
序言
这是其中一个问题,我认为有人已经解决了我的问题,但我不知道去哪里找。
问题
我正在寻找一个 MonadTransformer,它带有完整或不完整的想法,使得 monad 堆栈的操作将无法进行类型检查,除非它是完整的。
我的情况
我有一个 Monad 堆栈,其状态包含一个 MVar。无法写入此 MVar 将导致 thread blocked indefinitely in an MVar
异常。我可以只检查 MVar 本身,但是将它交给另一个线程(遵循相同的规则)也是填充 MVar 的有效方法(就像抛出错误一样)。
我正在寻找某种方式让类型检查器在 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
.
不过,此解决方案并不禁止重复写入。