Purescriptで以下が機能しない理由を理解しようとしています。私はそれがハスケルコミュニティによっても答えることができるという気持ちがあるので、私はそれをクロスリストしました。Purescript Eff Monadとdoブロックを理解する
一般的な要旨は次のとおりです。
私はdo
ブロックを持っている場合、私は使い捨ての値に投げることができませんか?この例では、一連のモナディック計算の途中で(Haskellのprint
に似た)何かを記録しようとしています。
main = do
a <- someAction1
b <- someAction2
_ <- log "here is a statement I want printed"
someAction3 a b
具体的には、私は次のようにとる関数(ハロゲン例のテンプレートプロジェクトから)私の心の中で
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"
のように動作するはずです、私が得るエラーは、モナドの型の不一致です
など種類私はpurescriptは私が「私はモナドに触れてる事を」宣言します知っている...タイプFree (HalogenFP t0 { "isOn" :: t1 | t2 } t3 t4)
...とタイプEff ("console" :: CONSOLE | t6)
に一致するようにしようとしているときは(
Free
とタイプ
Eff
と一致しませんでした。すなわち、
forall e. Eff (a :: SOMEVAR, b :: SOMEOTHERVAR | eff) Unit
が、私はこのケースでそれを行う方法がわからないんだけど...
これはデバッグのためのものですが、扱う代わりに[purescript-debug'](https://github.com/garyb/purescript-debug)の[Debug.Trace'モジュールを使用したい場合がありますどこにでもエフェクトを伝播させることで、一時的なデバッグロギングにかなり負担がかかります。ただし、デバッグ以外の目的では使用しないでください。名前が示すとおりです。 –
@AlexisKingこれはデバッグ用ではなく、すぐにメッセージを撃退できるようにするためです。また、なぜ自分の教育のために働いていないのかを知りたい。 –
'H.modify'は' Free .. ..'を生成しますが、 'log'は' Eff .. ..'を生成します - エラーはこれらが異なるタイプであることを伝えています。あなたは同じ 'do'ブロックでそれらを使うことはできません。 – user2407038