Я немного озадачен этим сообщением об ошибке
Warning: Error in module Chapter2:
Error in value declaration unionIsForeign:
Error checking that type
Control.Monad.Eff.Eff (trace :: Debug.Trace.Trace | u8717) u8715
subsumes type
Data.Either.Either Data.Foreign.ForeignError Chapter2.Union
Error at src/Chapter2.purs line 16, column 18 - line 20, column 1:
Cannot unify type
Control.Monad.Eff.Eff
with type
Data.Either.Either
это результат этого кода
module Chapter2 where
import Debug.Trace
import Data.Foreign
import Data.Foreign.Class
import Control.Monad.Eff
sideeffect :: forall e. Number -> Eff (trace :: Trace | e) Number
sideeffect v = return v
data Union = S String
instance unionIsForeign :: IsForeign Union where
read value = do
v <- sideeffect 42
return $ S "Test"
main = do
trace "Test"
Зачем нужно унифицировать Eff
и Either
? Похоже, это имеет место только при создании экземпляра класса типа IsForeign. sideeffect
успешно работает в main
- конечно, main имеет сигнатуру, указывающую на использование Eff Monad
> :t Chapter2.main
Compiling Chapter2
forall t20. Control.Monad.Eff.Eff (trace :: Debug.Trace.Trace | t20) Prelude.Unit