有人知道我如何处理诸如“不可以推断”(Reflex t0)这样的错误,这些错误是由于使用“从不”而产生的?
我正在重构一个应用程序的一部分,这意味着一些never事件不会被使用,但是由于它们是never,所以我不在乎。
我能让GHC也不在乎吗?
我了解-XExtendedDefaultRules,这至少有助于将forall t a. Event t a到forall t. Event t ()的类型进行专门化
我也想将t专门化为GHC会接受的任何值,因为它会导致死代码。
我是否可以在default (...)语句中写一些可以工作的东西?或者,编写default (IO)来将非完全指定的单元组指定为IO也同样不可能吗?
编辑:On @dalaing请求一个代码示例,这就是我为他准备的:https://gist.github.com/Wizek/d14aada2d75637cb4f424f8a324c7ad7
第1节和第2节编译,3没有,但我也想让3编译,因为编译器抱怨在某些东西只能是死代码含糊不清。
发布于 2019-02-13 07:55:22
与@dalaing #反射-玻璃钢一起,我们发现,如果启用了never :: Event t (),并且父小部件具有forall t. Reflex t =>约束或类似的功能,则-XScopedTypeVariables可以工作。
例如,链接代码示例中的第3节可以修改如下:
{-# 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
{-# 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能够被要求在类型检查方面更加宽容,不仅仅是在反射方面,也许现在还不可能做到这一点。
发布于 2019-02-13 13:35:55
使用
foo :: forall t m. MonadWidget t m => m ()
foo = do
let buttonEv = never @t
buttonEv <- button "click me"
clicksCountDy <- count buttonEv
display clicksCountDy这真的不是never的问题。这是一个不将行动绑定到当前单曲的问题。所讨论的问题可能是任何事情:
let buttonEv = button "never click me"这将创建一个按钮小部件操作,但不会将其“连接”到当前小部件。你不会在你的应用程序中看到“永不点击我”按钮。
另一方面,如果将never事件连接到您的小部件,
buttonEv <- return never您将不再需要@t注释。
不过,我最终发现,--注释在死代码的实例中运行良好。
-- let buttonEv = never如果必须的话,可以保留代码,但是这是告诉编译器代码不重要的最好方法。
https://stackoverflow.com/questions/54663807
复制相似问题