Не удалось вывести (Reflex t0), возникающее из использования «никогда» - PullRequest
0 голосов
/ 13 февраля 2019

Кто-нибудь знает, как я мог бы справиться с ошибками типа «Не могу вывести (Reflex t0), возникающими из-за использования« никогда »?»

Я рефакторинг части приложения, что означает несколько never события не привыкают, но так как они never для начала, мне все равно.

Могу ли я сделать так, чтобы GHC как-то не волновался?

Я знаю о-XExtendedDefaultRules, который, вероятно, по крайней мере помогает специализировать тип от forall t a. Event t a до forall t. Event t ()

И я хочу специализировать t также на любом значении, которое GHC примет, так как это в любом случае приводит к мертвому коду.

Могу ли я написать в операторе default (...) что-нибудь, что может сработать?Или это также невозможно написать default (IO), чтобы специализировать не полностью определенные монады для ввода-вывода?

Редактировать : На # reflex-frp @dalaing запросили пример кода, и этоэто то, что я собрал для него: https://gist.github.com/Wizek/d14aada2d75637cb4f424f8a324c7ad7

Раздел 1 и 2 компилируются, 3 - нет.Но я хочу также сделать 3 компиляции, так как компилятор жалуется на неоднозначность в том, что может быть только мертвым кодом.

Ответы [ 2 ]

0 голосов
/ 13 февраля 2019

Использование

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

Храните код, если нужно, но это лучший способ сообщить компилятору, что код не важен.

0 голосов
/ 13 февраля 2019

Вместе с @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 попросили быть более снисходительным при проверке мертвого кода в целом, не только в том, что касается рефлекса, но, возможно, это невозможнона данный момент.

...