Вместе с @dalaing на # reflex-frp мы обнаружили, что never :: Event t ()
работает, если -XScopedTypeVariables
включен, а родительский виджет имеет ограничение forall t. Reflex t =>
или подобное.
Например, раздел 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 попросили быть более снисходительным при проверке мертвого кода в целом, не только в том, что касается рефлекса, но, возможно, это невозможнона данный момент.