Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Haskell 用于对已完成动作进行类型检查的单变压器_Haskell_Monads_Monad Transformers - Fatal编程技术网

Haskell 用于对已完成动作进行类型检查的单变压器

Haskell 用于对已完成动作进行类型检查的单变压器,haskell,monads,monad-transformers,Haskell,Monads,Monad Transformers,序言 这是其中一个问题,我认为有人已经解决了我的问题,但我不知道去哪里寻找 问题 我正在寻找一个MonadTransformer,它带有完整或不完整的概念,这样monad堆栈的操作将无法进行类型检查,除非它是完整的 我的处境 我有一个状态为MVar的Monad堆栈。未能写入此MVar将导致MVar异常中的线程无限期阻塞。我可以只检查MVar本身,但将其交给另一个线程(遵循相同的规则)也是填充MVar的有效方法(就像抛出错误一样) 我正在寻找某种方法,如果monad运行时不满足其中一个条件,typ

序言

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

问题

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

我的处境

我有一个状态为MVar的Monad堆栈。未能写入此MVar将导致MVar异常中的
线程无限期阻塞。我可以只检查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
中输入函数来生成一个值。如果它们返回,它们一定调用了该函数

令牌的实际类型并不重要,它可以是一个简单的
()
。但是
确保写入
操作不应该知道这一点,因此所有

不过,这种解决方案并不禁止重复写入