H.HalogenM型
Halogen ComponentのActionのhandleActionの返り値の型
HalogenM is a crucial part of Halogen, often called the "eval" monad
これもEffectの一種
モナド変換子みたいなイメージかなmrsekut.icon
Halogen ComponentにはEffectのための仕組みがない
HlogenMを使うことで実現できる
使用するMonadも自由に選択できる
pursuit
定義
code:purs(hs)
newtype HalogenM state action slots output m a = HalogenM (Free (HalogenF state action slots output m) a)
Freeモナド
6つの型引数を取る
state
Halogen ComponentのStateの型
action
Halogen ComponentのActionの型
slots
HalogenのSlotの型
子Componentを持たない場合は、()にする
output
HalogenのOutputの型
特に指定しない場合は開いておく
親になにか返す時に指定する
m
Effectを実行する時に指定する
特に指定しない場合は開いておく
たいていEffectモナドかAffモナド
ここでMonadを指定したり、制約を書きたいなら、H.Component型のmにも同様の制約を付けないといけない
code: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.iconは今のところ、前者しか知らん
だから、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関数を使う
code:purs(hs)
random :: Effect Number
liftEffect :: MonadEffect m ⇒ Effect a → m a
liftEffect random :: MonadEffect m ⇒ m Number
これ、なんで #??
MonadEffect m ⇒ m NumberとEffect Numberって違う意味なの?
参考
3.Performing Effects - Halogen Guide