Purescript Галоген DeepPeek Ребенок вместо внука
Я пытаюсь адаптировать этот пример https://github.com/slamdata/purescript-halogen/blob/v0.12.0/examples/deep-peek/src/Main.purs#L58 (соответствующая часть скопирована ниже), но вместо этого заглядывать внуку, я просто хочу заглянуть ребенка, или в этом случае peekList
, Я также хочу сохранить тип слота в качестве параметра в функции Peek для peekList
,
peek :: forall a. H.ChildF ListSlot ListQueryP a -> H.ParentDSL State (ListStateP g) Query ListQueryP g ListSlot Unit
peek = coproduct peekList peekTicker <<< H.runChildF
peekList :: forall a. ListQuery a -> H.ParentDSL State (ListStateP g) Query ListQueryP g ListSlot Unit
peekList _ =
-- we're not actually interested in peeking on the list.
-- instead of defining a function like this, an alternative would be to use
-- `(const (pure unit))` in place of `peekList` in the `coproduct` function
pure unit
peekTicker :: forall a. H.ChildF TickSlot TickQuery a -> H.ParentDSL State (ListStateP g) Query ListQueryP g ListSlot Unit
peekTicker (H.ChildF _ (Tick _)) = H.modify (\st -> { count: st.count + 1 })
peekTicker _ = pure unit
Как я могу на самом деле заглянуть peekList
без потери параметра слота?
Я пытался удалить H.runChildF
:
peek = coproduct peekList (const (pure unit))
а затем добавив обратно в слот параметр peekList
:
peekList :: forall a. H.ChildF ListSlot ListQuery a -> H.ParentDSL State (ListStateP g) Query ListQueryP g ListSlot Unit
Но тогда в peek
Я получаю сообщение об ошибке "Не удалось сопоставить тип ChildF с типом Coproduct при попытке сопоставить тип ChildF ListSlot с типом Coproduct (ChildF ListSlot ListQuery)"
Если я просто попробую использовать peekList
вместо о peek
, я получаю сообщение об ошибке "Не удалось сопоставить тип Coproduct ListQuery (ChildF TickSlot TickQuery) с типом ListQuery при попытке сопоставить тип ChildF ListSlot (Coproduct ListQuery (ChildF TickSlot TickQuery)) с типом ChildF ListSlot ListQuery"
Любая помощь будет очень признательна, спасибо!
1 ответ
Я посмотрел на типы поближе и увидел, что второй аргумент peekList - это Coproduct, упаковывающий Either
где Left
значение - это список запросов, которые я хочу посмотреть. Так что просто сопоставьте образец на тех и добавьте peekList
к компоненту peek
параметр. Также мне пришлось изменить тип подписи, чтобы использовать ListQueryP
вместо ListQuery
,
peekList :: forall a. H.ChildF ListSlot ListQueryP a -> H.ParentDSL State (ListStateP g) Query ListQueryP g ListSlot Unit
peekList (H.ChildF _ (Coproduct queryEi)) =
case queryEi of
Left (AddTicker a) -> pure unit
_ -> pure unit