H.HalogenM型
HalogenM is a crucial part of Halogen, often called the "eval" monad
これもEffectの一種
HlogenMを使うことで実現できる
使用するMonadも自由に選択できる
定義
code: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を実行する時に指定する
特に指定しない場合は開いておく
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って違う意味なの?
参考