gpt4 book ai didi

haskell - 了解 Purescript Eff Monad 和 do block

转载 作者:行者123 更新时间:2023-12-02 08:47:28 24 4
gpt4 key购买 nike

我试图理解为什么以下内容在 Purescript 中不起作用。我感觉 Haskell 社区也可以回答这个问题,因此我将其交叉列出。

总体要点是:

如果我有一个 do block ,我可以不添加一次性值吗?在本例中,我尝试在一系列单子(monad)计算中间记录一些内容(类似于 Haskell 的 print)。

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"

具体来说,我得到的错误是单子(monad)的类型不匹配

Could not match type Eff with type Free while trying to match type Eff ( "console" :: CONSOLE | t6 ) with type Free (HalogenFP t0 { "isOn" :: t1 | t2 } t3 t4) ... etc...

我知道 purescript 让我声明“我在 monad 中接触的东西”(即 forall e.Eff ( a::SOMEVAR, b::SOMEOTHERVAR | eff ) 单元,但我不知道在这种情况下该怎么做...

最佳答案

如果您使用的是 0.12.0 版的halogen,您应该能够使用 https://pursuit.purescript.org/packages/purescript-aff-free/3.0.0/docs/Control.Monad.Aff.Free#v:fromEff 中的 fromEff像这样:

data Query a = ToggleState a

eval :: Query ~> H.ComponentDSL State Query g
eval (Toggle next) = do
H.modify (\state -> state { isOn = not state.isOn })
_ <- H.fromEff (log "updating the state!")
pure next

在即将推出的卤素版本 (>= 0.13) 中,这会变得更好,其中 liftEff 应该足够了。

为什么不能立即使用 log 的原因是 H.ComponentDSL 不是 Eff 的类型同义词,但对于 Free 来说,您不能简单地混合 EffComponentDSL 操作。

关于haskell - 了解 Purescript Eff Monad 和 do block ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41606126/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com