首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无法推断(Reflex t0)是因使用“从不”而产生的

无法推断(Reflex t0)是因使用“从不”而产生的
EN

Stack Overflow用户
提问于 2019-02-13 06:22:23
回答 2查看 120关注 0票数 2

有人知道我如何处理诸如“不可以推断”(Reflex t0)这样的错误,这些错误是由于使用“从不”而产生的?

我正在重构一个应用程序的一部分,这意味着一些never事件不会被使用,但是由于它们是never,所以我不在乎。

我能让GHC也不在乎吗?

我了解-XExtendedDefaultRules,这至少有助于将forall t a. Event t aforall t. Event t ()的类型进行专门化

我也想将t专门化为GHC会接受的任何值,因为它会导致死代码。

我是否可以在default (...)语句中写一些可以工作的东西?或者,编写default (IO)来将非完全指定的单元组指定为IO也同样不可能吗?

编辑:On @dalaing请求一个代码示例,这就是我为他准备的:https://gist.github.com/Wizek/d14aada2d75637cb4f424f8a324c7ad7

第1节和第2节编译,3没有,但我也想让3编译,因为编译器抱怨在某些东西只能是死代码含糊不清。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-02-13 07:55:22

与@dalaing #反射-玻璃钢一起,我们发现,如果启用了never :: Event t (),并且父小部件具有forall t. Reflex t =>约束或类似的功能,则-XScopedTypeVariables可以工作。

例如,链接代码示例中的第3节可以修改如下:

代码语言:javascript
复制
{-# language ScopedTypeVariables #-}

main = run 3000 $ mainWidget foo

foo :: forall t m. MonadWidget t m => m ()
foo = do
  let buttonEv = never :: Event t ()
  buttonEv <- button "click me"
  clicksCountDy <- count buttonEv
  display clicksCountDy

它会编译。但是,必须在任何地方指定事件类型是不方便的,而且它也可能不像我们想要的那样干燥,因此-XPartialTypeSignatures可以通过never :: Event t _提供帮助。

或者更好的,我发现,我们可以做never @t-XTypeApplications

代码语言:javascript
复制
{-# language ScopedTypeVariables #-}
{-# language TypeApplications #-}

main = run 3000 $ mainWidget foo

foo :: forall t m. MonadWidget t m => m ()
foo = do
  let buttonEv = never @t
  buttonEv <- button "click me"
  clicksCountDy <- count buttonEv
  display clicksCountDy

因此,从现在开始,我可能只是制定了一个策略,在我的反射相关代码部分中,我从不编写never,并且总是编写(never @t),这在很大程度上解决了这个问题。

我仍然希望GHC能够被要求在类型检查方面更加宽容,不仅仅是在反射方面,也许现在还不可能做到这一点。

票数 3
EN

Stack Overflow用户

发布于 2019-02-13 13:35:55

使用

代码语言:javascript
复制
foo :: forall t m. MonadWidget t m => m ()
foo = do
  let buttonEv = never @t
  buttonEv <- button "click me"
  clicksCountDy <- count buttonEv
  display clicksCountDy

这真的不是never的问题。这是一个不将行动绑定到当前单曲的问题。所讨论的问题可能是任何事情:

代码语言:javascript
复制
let buttonEv = button "never click me"

这将创建一个按钮小部件操作,但不会将其“连接”到当前小部件。你不会在你的应用程序中看到“永不点击我”按钮。

另一方面,如果将never事件连接到您的小部件,

代码语言:javascript
复制
buttonEv <- return never

您将不再需要@t注释。

不过,我最终发现,--注释在死代码的实例中运行良好。

代码语言:javascript
复制
-- let buttonEv = never

如果必须的话,可以保留代码,但是这是告诉编译器代码不重要的最好方法。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54663807

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档