2017-01-12 7 views
2

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" 

のように動作するはずです、私が得るエラーは、モナドの型の不一致です

など種類 Free (HalogenFP t0 { "isOn" :: t1 | t2 } t3 t4) ...とタイプ Eff ("console" :: CONSOLE | t6)に一致するようにしようとしているとき

は(

私はpurescriptは私が「私はモナドに触れてる事を」宣言します知っている...タイプ Freeとタイプ Effと一致しませんでした。すなわち、 forall e. Eff (a :: SOMEVAR, b :: SOMEOTHERVAR | eff) Unitが、私はこのケースでそれを行う方法がわからないんだけど...

+0

これはデバッグのためのものですが、扱う代わりに[purescript-debug'](https://github.com/garyb/purescript-debug)の[Debug.Trace'モジュールを使用したい場合がありますどこにでもエフェクトを伝播させることで、一時的なデバッグロギングにかなり負担がかかります。ただし、デバッグ以外の目的では使用しないでください。名前が示すとおりです。 –

+0

@AlexisKingこれはデバッグ用ではなく、すぐにメッセージを撃退できるようにするためです。また、なぜ自分の教育のために働いていないのかを知りたい。 –

+0

'H.modify'は' Free .. ..'を生成しますが、 'log'は' Eff .. ..'を生成します - エラーはこれらが異なるタイプであることを伝えています。あなたは同じ 'do'ブロックでそれらを使うことはできません。 – user2407038

答えて

6

あなたがハロゲンのバージョン0.12.0で作業しているあなたがそうのよう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 

これは、liftEffで十分であるはずである次期バージョンのハロゲン(> = 0.13)でもっとうまくいくようになるでしょう。

あなただけのすぐlogを使用できない理由理由は、H.ComponentDSLはなく、Freeため、Effの型同義語ではありませんので、あなたは、単にEffComponentDSLアクションを混在させることはできませんということです。

+0

ああありがとうございます。私はliftEffを使用しようとしたが、正しいコンテキストに戻っていない理由を混乱させてしまった。 –

+0

しかし、私はまだEffモナドをうまく持ち上げることができません。私は注釈の型を指定する必要があると思いますか?これはコンパイラのことですか? –

+3

あなたは 'g'をもう完全に多型に保つことはできません。これは、プログラム全体で使用されているエフェクトを実行するために使用されます。例については、https://github.com/slamdata/purescript-halogen/blob/v0.12.0/examples/ajax/src/Main.pursを参照してください。 'ajax :: AJAX'を' console :: CONSOLE'に置き換えたいでしょう –

関連する問題