Подпись типа 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 сказал, что это может быть ошибка в проверке типов. Я размещаю это здесь так или иначе, пока это не установлено фактом.

Спасибо! (:

0 ответов

Другие вопросы по тегам