generated at
H.HalogenM型
Halogen ComponentのAction handleAction の返り値の型
HalogenM is a crucial part of Halogen, often called the "eval" monad
これもEffectの一種
モナド変換子みたいなイメージかなmrsekut


Halogen ComponentにはEffectのための仕組みがない
HlogenMを使うことで実現できる
使用するMonadも自由に選択できる



定義
purs(hs)
newtype HalogenM state action slots output m a = HalogenM (Free (HalogenF state action slots output m) a)




6つの型引数を取る
state
action
slots
子Componentを持たない場合は、 () にする
output
特に指定しない場合は開いておく
親になにか返す時に指定する
m
Effectを実行する時に指定する
特に指定しない場合は開いておく
ここでMonadを指定したり、制約を書きたいなら、H.Component型 m にも同様の制約を付けないといけない
purs(hs)
-- ②Componentのmにも同様の制約を付ける必要がある component :: forall query input output m. MonadAff m => H.Component query input output m -- ①HalogenMのmに制約をつけたいなら、 handleAction :: forall output m. MonadAff m => Action -> HalogenM State Action () output m Unit
a
result of the HalogenM expression
以下のどちらかのパターンを取る
handleAction :: Action -> H.HalogenM State Action Slots Output m Unit
handleQuery :: forall a. Query a -> H.HalogenM State Action
mrsekutは今のところ、前者しか知らん
だから、 Unit になっているものしか見たことがない



HalogenMによって以下のようなことができる
state
forking threads
starting subscriptions
etc.


微妙に関係ないけど
これの「But we can't use it directly:〜」のところ
handleActionに handleAction :: forall output m. Action -> H.HalogenM State Action () output m Unit という型を指定しても、その中で Effect m の関数を直接実行できない
Effect m の関数を実行できない
MonadEffect m => m a の関数じゃないと実行できない
だから、 liftEffect 関数を使う
purs(hs)
random :: Effect Number liftEffect :: MonadEffect m ⇒ Effect a → m a liftEffect random :: MonadEffect m ⇒ m Number
これ、なんで #??
MonadEffect m ⇒ m Number Effect Number って違う意味なの?




参考