- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
这个问题显然与讨论的问题here相关。和 here 。不幸的是,我的要求与这些问题略有不同,并且给出的答案不适用于我。我也不太明白为什么 runST
在这些情况下无法进行类型检查,这没有帮助。
我的问题是这样的,我有一段代码使用一个 monad 堆栈,或者更确切地说是单个 monad:
import Control.Monad.Except
type KErr a = Except KindError a
另一段代码需要与此集成,将其包装在 STT monad 中:
type RunM s a = STT s (Except KindError) a
在这些部分之间的接口(interface)处,我显然需要包裹和展开外层。我有以下函数可以在 KErr
-> RunM
方向工作:
kerrToRun :: KErr a -> RunM s a
kerrToRun e = either throwError return $ runExcept e
但由于某种原因,我无法得到与类型检查相反的结果:
runToKErr :: RunM s a -> KErr a
runToKErr r = runST r
我正在假设,由于 RunM
的内部 monad 与 KErr
具有相同的结构,一旦我解开包装,我就可以返回它STT
层,但我似乎无法做到这一点,因为 runST
提示其类型参数:
src/KindLang/Runtime/Eval.hs:18:21:
Couldn't match type ‘s’ with ‘s1’
‘s’ is a rigid type variable bound by
the type signature for runToKErr :: RunM s a -> KErr a
at src/KindLang/Runtime/Eval.hs:17:14
‘s1’ is a rigid type variable bound by
a type expected by the context:
STT s1 (ExceptT KindError Data.Functor.Identity.Identity) a
at src/KindLang/Runtime/Eval.hs:18:15
Expected type: STT
s1 (ExceptT KindError Data.Functor.Identity.Identity) a
Actual type: RunM s a
我也尝试过:
runToKErr r = either throwError return $ runExcept $ runST r
为了更强有力地将 runST
与其预期返回类型隔离,以防万一这是问题的原因,但结果是相同的。
这个 s1
类型来自哪里,我如何说服 ghc 它与 s
类型相同?
最佳答案
(下面讨论的是 ST s a
,但应用与 STT s m a
相同;我只是避免了下面讨论变压器版本带来的不必要的复杂性)
您看到的问题是 runST
具有类型 (forall s. ST s a) -> a
来隔离任何潜在的 (STRef
-改变)来自外部、纯粹世界的计算的影响。所有 ST
计算、STRef
等所标记的 s
幻像类型的全部要点是跟踪哪个“ >ST
-domain”他们所属; runST
的类型确保域之间不能传递任何内容。
您可以通过强制执行相同的不变量来编写runToKErr
:
{-# language Rank2Types #-}
runToKErr :: (forall s. RunM s a) -> KErr a
runToKErr = runST
(当然,您可能会进一步意识到这个限制对于您希望编写的程序来说太强了;那时您将需要失去希望,抱歉,我的意思是您需要重新设计您的程序程序。)
至于错误消息,您无法“说服类型检查器 s1
和 s
是同一类型”的原因是,如果我向您传递一个ST s a
对于 s
和 a
的给定选择,这与给您一些允许您选择自己的 不同>s
。 GHC 选择 s1
(Skolemized 变量)作为 s
,因此尝试将 ST s a
与 ST s1 a
统一>
关于haskell - 在变压器堆栈中展开 STT 单子(monad)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36830676/
streaming套餐优惠a zipsWith function zipsWith :: (Monad m, Functor h) => (forall x y. f x -> g y ->
我正在尝试制作也可以在程序包上运行的 Dart 转换器,但是我无法弄清楚当前的状态 class MyTransformer extends Transformer implements LazyTra
我的pubspec.yaml文件中包含以下行 transformers: - di - polymer: entry_points: web/index.html di软件包作为依赖导
我正在尝试从 attoparsec 解构 IResult monad分成几 block 。这是IResult data IResult t r = Fail t [String] String
我正在阅读现实世界 Haskell 中的 monad 转换器。在以下示例中,堆栈为 Writer在顶部State在Reader之上在IO之上。 {-# Language GeneralizedNewt
我已经编写了单元测试用例来在我的 Mule 流程中单独测试消息处理器。 但是单元测试失败并出现错误 org.mule.api.transformer.TransformerMessagingExcep
“Monads 允许程序员使用顺序构建 block 来构建计算”,因此它允许我们组合一些计算。如果是这样,那为什么下面的代码不能运行呢? import Control.Monad.Trans.Stat
这个问题与其他地方已经涵盖的问题很接近,但我还没有找到任何专门解决这个问题的内容(至少不是以我能够理解的方式)。 我想以取决于各种随机选择的方式更新状态。由于我正在使用 RandomSource 类型
我是 Spring 集成新手,正在从事 SI 项目。我正在做一项简单的工作,从 channel (fromAdapter)获取消息,调用转换器并将输出发送到另一个 channel (toQueue)。
我最近安装了 OrientDB 并尝试使用 ETL 模块创建导入。 在 OS X 上运行,我使用自制软件安装了 orientDB。 我创建了以下 ETL 脚本: { "config": {
我有两个变压器,平移和旋转如下: namespace bg = boost::geometry; namespace trans = bg::strategy::transform; trans::t
我指的是来自 stackoverflow 的这个答案,但我找不到关于我的问题的任何线索:[https://stackoverflow.com/questions/63141267/importerro
我正在寻找一个 monad 转换器,我可以用它来发出 HTTP(等)类型的请求/响应。用途与 cURL 命令行工具类似。 [已编辑] 最佳答案 嗯,有 curl包,它使用 IO monad。 关于ha
向哈斯凯勒同胞们问好。 这是一个更大的约束满足问题的玩具版本,我是目前正在努力。 下面的代码使用列表 monad 转换器来表示给定的正整数n作为不同小偶数的总和方法。 import Control.M
我正在寻找一个让我很困扰的场景的解决方案。 我正在开发 mule 3.3。 我有一些传入的 XML 和来自丰富器的第二个 XML。 现在,来自丰富器的 xml 将被添加到我的输入 XML 中。 我的流
我指的是来自 stackoverflow 的这个答案,但我找不到关于我的问题的任何线索:[https://stackoverflow.com/questions/63141267/importerro
我想将 SXSSF 转换器与 JXLS 一起使用。我试图以这样一种方式编写我的模板,即我不会得到“试图在已经写入磁盘的范围内写入一行”异常。该模板捕获已知列(例如“HEADER 0”)和未知列(以“_
早上好,我正在尝试复制此内容:http://jxls.sourceforge.net/getting_started.html 使用我自己的集体诉讼而不是员工。但我有一些问题。 这是我的代码: pac
我们在 ASP.NET MVC 元素中使用 BundleTransformer 来 bundle 我们的样式文件。 这很好用,但是我们注意到当我们使用 @import CSS at 规则在 LESS
我正在微调来自 huggingface 的 bert 模型.有没有办法手动设置某个词块的初始嵌入?例如使单词“dog”的初始嵌入等于 torch.ones(768) .谢谢! 最佳答案 您可以设置 B
我是一名优秀的程序员,十分优秀!