Haskell 用于对已完成动作进行类型检查的单变压器
序言 这是其中一个问题,我认为有人已经解决了我的问题,但我不知道去哪里寻找 问题 我正在寻找一个MonadTransformer,它带有完整或不完整的概念,这样monad堆栈的操作将无法进行类型检查,除非它是完整的 我的处境 我有一个状态为MVar的Monad堆栈。未能写入此MVar将导致MVar异常中的Haskell 用于对已完成动作进行类型检查的单变压器,haskell,monads,monad-transformers,Haskell,Monads,Monad Transformers,序言 这是其中一个问题,我认为有人已经解决了我的问题,但我不知道去哪里寻找 问题 我正在寻找一个MonadTransformer,它带有完整或不完整的概念,这样monad堆栈的操作将无法进行类型检查,除非它是完整的 我的处境 我有一个状态为MVar的Monad堆栈。未能写入此MVar将导致MVar异常中的线程无限期阻塞。我可以只检查MVar本身,但将其交给另一个线程(遵循相同的规则)也是填充MVar的有效方法(就像抛出错误一样) 我正在寻找某种方法,如果monad运行时不满足其中一个条件,typ
线程无限期阻塞。我可以只检查MVar本身,但将其交给另一个线程(遵循相同的规则)也是填充MVar的有效方法(就像抛出错误一样)
我正在寻找某种方法,如果monad运行时不满足其中一个条件,typechecker就会抛出一个错误。我可以在运行时进行检查,但我认为可能有一种方法可以使用类型系统。听起来好像有什么方法可以帮上忙。索引单子根据某种类型级别的状态允许或禁止某些操作
我们也可以依赖多态性:
{-# 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)
其思想是类型的动作需要返回令牌
值,但只知道如何通过在Gulp
中输入函数来生成一个值。如果它们返回,它们一定调用了该函数
令牌的实际类型并不重要,它可以是一个简单的()
。但是确保写入
操作不应该知道这一点,因此所有
的
不过,这种解决方案并不禁止重复写入