- 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/
这个问题显然与讨论的问题here相关。和 here 。不幸的是,我的要求与这些问题略有不同,并且给出的答案不适用于我。我也不太明白为什么 runST 在这些情况下无法进行类型检查,这没有帮助。 我的问
有什么方法可以隐藏在android中使用语音转文本时显示的对话框吗?我在某处读到这是不可能的,但肯定有一种方法至少可以显示它然后立即隐藏它? 也许有某种方法可以对某些东西进行子类化并改变它的外观?在我
我正在使用 Cloud Functions 从存储桶中的 getUserMedia() 转换音频/mp4 使用 ffmpeg 转换为 audio/x-flac 格式,以便能够使用 Google STT
文字转语音 我一直在尝试在 windows 和 Linux 环境中运行 pyttsx... Linux 环境: import pyttsx engine = pyttsx.init() python
Data.Vector.Mutable 似乎需要 ST 和 IO monad 中的 PrimMonad 实例。 类型类定义如下 -- -- | Class of primitive state-tra
无法解析 MediaType AUDIO_WEBM。我错过了什么吗?我收到以下错误。 [ERROR] /C:/Users/IBM_ADMIN/workspace/ListenApp/src/main/
我之前让这段代码在我的设备上运行良好,但现在它根本无法运行。设备是三星 SM-G900P(Android 6.0.2,API23)。 我必须自己构建语音转文本库、核心库和文本转语音库,因为我的应用程序
我当前正在尝试将麦克风流发送到 Watson STT 服务,但由于某种原因,Watson 服务未接收该流(我猜测),因此我收到错误“错误:30 秒内未检测到语音”。 请注意,我已将 .wav 文件传输
我在沙盒中安装来自 Hackage 的最新 ghc-mod (5.2.1.1) 时遇到此错误: [15 of 38] Compiling Language.Haskell.GhcMod.CabalCo
我正在尝试构建一个采用流式音频输入(例如:麦克风中的线路)并使用 IBM Bluemix (Watson) 进行语音转文本的应用。 我简要修改了找到的示例 Java 代码 here .此示例发送的是
我是一名优秀的程序员,十分优秀!