Подпись типа purescript не компилируется, код работает без нее; предложенная подпись не работает
Следующий код выдает эту ошибку:
module Broken1 where
import Control.Monad.Aff.Class (MonadAff)
import Control.Monad.Aff (Aff())
import DOM.HTML.Types
import Halogen
import DOM
import Control.Monad.Eff.Exception
import Control.Monad.Aff.AVar
import Prelude
import qualified Halogen.HTML.Indexed as H
data State = State
data Query a = Query a
ui :: forall eff g. (MonadAff (HalogenEffects eff) g) => Component State Query g
ui = component (\_ -> H.div_ []) (\(Query next) -> pure next)
main' :: forall eff a. (HTMLElement -> Aff (HalogenEffects eff) a)
-> Aff (HalogenEffects eff) Unit
main' addToDOM = do
{ node: node, driver: driver } <- runUI ui State
let driver' :: Natural Query (Aff (HalogenEffects eff))
driver' = driver
return unit
Ошибка:
at Broken1.purs line 34, column 19 - line 36, column 5
Could not match type
a2
with type
a1
while trying to match type a2
with type a1
while checking that expression driver
has type Query a1 -> Aff ( avar :: AVAR
, err :: EXCEPTION
, dom :: DOM
| eff1
)
a1
in value declaration main'
Если я опущу тип подписи для driver'
нет ошибки компилятора, как я и надеялся. Если я спрошу psc
для подписи (путем замены типа на _
), это предложение:
Wildcard type definition has the inferred type
forall a. Query a -> Aff ( dom :: DOM
, err :: EXCEPTION
, avar :: AVAR
| eff4
)
a
Когда я вырезал и вставил это в код вместо моего оригинального типа, ошибка та же, что и выше.
Во втором случае это действительно имеет смысл, поскольку квантификатор открывает новую область видимости для a, которая должна быть зафиксирована в сигнатуре main'. Но даже если я уберу forall a
, ошибка типа остается на месте.
Гариб ранее сегодня на #purescript сказал, что это может быть ошибка в проверке типов. Я размещаю это здесь так или иначе, пока это не установлено фактом.
Спасибо! (: