У меня есть следующая программа, написанная с Eff
s и Aff
s. Который работает, как и ожидалось. То есть он выводит заданное Int
и выполняет асинхронные вычисления.
type JsonResponse = AffjaxResponse Json
access :: forall e m. Aff (ajax :: AJAX | e) (Either Error JsonResponse)
access = attempt $ get "http://localhost:8080/livesys/Robert"
staging :: forall e. Int -> Eff (console :: CONSOLE | e) Int
staging i = do
liftEff $ log $ ">>" ++ show i
return i
main :: forall a. Int -> Aff (ajax :: AJAX, console :: CONSOLE| a) Int
main state = do
s <- liftEff $ staging state
a <- liftAff access
return s
Однако если я изменю порядок вызовов в main
, произойдет нечто загадочное:
main :: forall a. Int -> Aff (ajax :: AJAX, console :: CONSOLE| a) Int
main state = do
a <- liftAff access
s <- liftEff $ staging state
return s
функция staging
теперь вызывается дважды! Что?
Кто-нибудь может это объяснить?
Спасибо за вашу помощь
liftAff
вmain
? Я не думаю, что это необходимо. (Не для оправдания такого поведения, которое, безусловно, кажется неправильным; я просто пытаюсь поставить диагноз) - person hdgarrood   schedule 29.04.2016psc-bundle
и загрузить ее на pastebin? - person hdgarrood   schedule 29.04.2016psc-bundle
должен удалить весь мертвый код. - person hdgarrood   schedule 29.04.2016main
имеет такой тип, а неEff _ _
? - person Phil Freeman   schedule 29.04.2016main :: forall a. Int -> Eff (ajax :: AJAX, console :: CONSOLE| a) Int ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ No type class instance was found for Control.Monad.Aff.Class.MonadAff ( ajax :: AJAX | _0 ) (Eff ( ajax :: AJAX, console :: CONSOLE | a0 ) ) The instance head contains unknown type variables. Consider adding a type annotation. in value declaration main
- person robkuz   schedule 30.04.2016Aff
обратно вEff
, напримерlaunchAff
. - person Phil Freeman   schedule 30.04.2016