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
Другие вопросы по тегам