Я пытаюсь понять, почему следующее не работает в Purescript. У меня есть чувство, что на него также может ответить сообщество Haskell, поэтому я перечислил его.
Общая суть:
Если у меня есть блок do
, могу ли я не добавить одноразовое значение? В этом случае я пытаюсь зарегистрировать что-то (подобное print
в Haskell) в середине серии монадических вычислений.
main = do
a <- someAction1
b <- someAction2
_ <- log "here is a statement I want printed"
someAction3 a b
В частности, у меня есть функция, которая принимает следующее (из примера проекта шаблона Halogen)
data Query a = ToggleState a
eval :: Query ~> H.ComponentDSL State Query g
eval (Toggle next) = do
H.modify (\state -> state { isOn = not state.isOn })
_ <- log "updating the state!"
pure next
На мой взгляд, это должно работать как в Haskell
barf :: IO Int
barf = do
_ <- print "Here I am!"
return 5
main :: IO ()
main = do
a <- barf
_ <- print $ "the value is: " ++ (show a)
print "done"
В частности, ошибка, которую я получаю, - это несоответствие типов монад
Не удалось сопоставить тип
Eff
с типомFree
при попытке сопоставить типEff ( "console" :: CONSOLE | t6 )
с типомFree (HalogenFP t0 { "isOn" :: t1 | t2 } t3 t4)
... и т. Д.
Я знаю, что purescript заставляет меня объявлять «вещи, которых я касаюсь в монаде» (т.е. forall e. Eff ( a :: SOMEVAR, b :: SOMEOTHERVAR | eff ) Unit
, но я не уверен, как это сделать в данном случае ...
Debug.Trace
изpurescript-debug
иметь дело с распространением эффектов повсюду, что довольно обременительно для временного ведения журнала отладки. Однако вы не должны использовать это ни для чего, кроме отладки, как следует из названия. - person Alexis King   schedule 12.01.2017H.modify
даетFree .. ..
, аlog
даетEff .. ..
- ошибка сообщает вам, что это разные типы. Вы не можете использовать их в одномdo
блоке. - person user2407038   schedule 12.01.2017