2017-04-13 3 views
0

Aff 내에서 Eff 전화를 시도 :중복 예외 오류

Could not match type 

    (exception :: EXCEPTION 
    , exception :: EXCEPTION 
    ) 

    with type 

    (console :: CONSOLE 
    , exception :: EXCEPTION 
    , exception :: EXCEPTION 
    ) 


while trying to match type Eff 
          (exception :: EXCEPTION 
          , exception :: EXCEPTION 
          ) 
    with type Eff 
       (console :: CONSOLE 
       , exception :: EXCEPTION 
      ) 
while checking that expression (apply void) (launchAff ((bind (...)) (\$0 -> 
                     ... 
                    ) 
                 ) 
              ) 
    has type Eff 
      (console :: CONSOLE 
      , exception :: EXCEPTION 
      ) 
      Unit 
in value declaration g 

어떻게해야합니까 :

import Prelude 
import Control.Monad.Aff (Aff, launchAff) 
import Control.Monad.Eff (Eff) 
import Control.Monad.Eff.Class (liftEff) 
import Control.Monad.Eff.Console (CONSOLE, log) 
import Control.Monad.Eff.Exception (EXCEPTION) 

f :: forall eff. Int -> Aff (exception :: EXCEPTION) String 
f i = pure $ show i 

g :: forall eff. Eff (console :: CONSOLE, exception :: EXCEPTION) Unit 
g = void $ launchAff do 
    s <- f 1 
    liftEff $ log s 

이 중복 저를 얻는다? purescript 버전 0.11.3 사용.

답변

0

입력란에 exception 레이블이 포함되어 있지 않은 유형이 launchAff이기 때문입니다.

forall eff. Eff (console :: CONSOLE 
       , exception :: EXCEPTION 
       , exception :: EXCEPTION 
       ) Unit 

그러나 이것은 당신이 매우 자연스러운하지 않은, launchAff 외부에 두 번 catchException를 사용할 필요가 의미 : 한 가지 해결책은 g의 결과에 두 번 라벨을 포함하는 것입니다.

또 다른 하나는 launchAff으로 전화를 걸어 catchException을 사용하여 라벨을 제거하는 것입니다.

세 번째 옵션은 purescript-aff 메시지의 버그를보고하고 launchAff의 유형을 변경하려고하는 것입니다.