次のコードでは、このエラーが発生します。
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 は、タイプ チェッカーのバグである可能性があると述べました。とにかく、それが確立された事実になるまで、私はこれをここに投稿しています.
ありがとう!(: