1

次のコードでは、このエラーが発生します。

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

これを元の型ではなくコードにカット アンド ペーストすると、エラーは上記と同じになります。

2 番目のケースでは、量指定子が a の新しいスコープを開き、main' のシグネチャでキャプチャする必要があるため、これは実際に意味があります。しかし、を削除してもforall a、型エラーが残ります。

#purescript の garyb は、タイプ チェッカーのバグである可能性があると述べました。とにかく、それが確立された事実になるまで、私はこれをここに投稿しています.

ありがとう!(:

4

0 に答える 0