2016-07-15 4 views
1

할아버지, 할아버지, 할아버지, 할아버지, 할아버지, 할아버지, 할아버지, 할아버지, 할아버지, 할아버지, 할아버지, 할아버지, 할아버지, 할아버지, 할아버지, 할아버지, 나는 here과 같은 "요청"을 사용해 보았습니다. 그러나 자신의 자식도 가진 자식의 상태를 요청할 때 유형이 일치하지 않습니다. 가이드가있는 예제는 아이가없는 아이의 상태를 요청할 때 잘 작동합니다.Pulscript Halogen : 부모이기도 한 하위 구성 요소의 상태를 요청할 수 있습니까?

오류 :

Could not match type 

    Query 

with type 

    Coproduct (Coproduct Query (ChildF AnswerSlot Query)) Query 

답변

1

예, 확실히. 아마도 자식에 대한 쿼리에 left이 누락되었을 것입니다. 이는 자식의 쿼리 대수가 자체 자식을 갖는 Coproduct f (ChildF p f')의 형식이어야하기 때문에 필요합니다.

이에 따라 손자에 대한 적절한 값을 가진 ChildF을 구성하여 조부모로부터 손자에게도 문의 할 수 있습니다. right을 사용합니다. 감사 -

module Main where 

import Prelude 

import Data.Functor.Coproduct (Coproduct, left, right) 
import Data.Maybe (Maybe(..), fromMaybe) 

import Debug.Trace (traceA) -- from purescript-debug 

import Halogen as H 
import Halogen.HTML as HH 

-------------------------------------------------------------------------------- 

type GrandState = Unit 
data GrandQuery a = AskGrandChild (String -> a) 

grandchild :: forall g. H.Component GrandState GrandQuery g 
grandchild = H.component { render, eval } 
    where 
    render :: GrandState -> H.ComponentHTML GrandQuery 
    render _ = HH.div_ [] 
    eval :: GrandQuery ~> H.ComponentDSL GrandState GrandQuery g 
    eval (AskGrandChild k) = pure $ k "Hello from grandchild" 

-------------------------------------------------------------------------------- 

type ChildState = Unit 
data ChildQuery a = AskChild (String -> a) 
type GrandSlot = Unit 

type ChildState' g = H.ParentState ChildState GrandState ChildQuery GrandQuery g GrandSlot 
type ChildQuery' = Coproduct ChildQuery (H.ChildF GrandSlot GrandQuery) 

child :: forall g. Functor g => H.Component (ChildState' g) ChildQuery' g 
child = H.parentComponent { render, eval, peek: Nothing } 
    where 
    render :: ChildState -> H.ParentHTML GrandState ChildQuery GrandQuery g GrandSlot 
    render _ = HH.slot unit \_ -> { component: grandchild, initialState: unit } 
    eval :: ChildQuery ~> H.ParentDSL ChildState GrandState ChildQuery GrandQuery g GrandSlot 
    eval (AskChild k) = pure $ k "Hello from child" 

-------------------------------------------------------------------------------- 

type ParentState = Unit 
data ParentQuery a = Something a 
type ChildSlot = Unit 

type ParentState' g = H.ParentState ParentState (ChildState' g) ParentQuery ChildQuery' g ChildSlot 
type ParentQuery' = Coproduct ParentQuery (H.ChildF ChildSlot ChildQuery') 

parent :: forall g. Functor g => H.Component (ParentState' g) ParentQuery' g 
parent = H.parentComponent { render, eval, peek: Nothing } 
    where 
    render :: ParentState -> H.ParentHTML (ChildState' g) ParentQuery ChildQuery' g ChildSlot 
    render _ = HH.slot unit \_ -> { component: child, initialState: H.parentState unit } 
    eval :: ParentQuery ~> H.ParentDSL ParentState (ChildState' g) ParentQuery ChildQuery' g ChildSlot 
    eval (Something next) = do 

    -- note the `left` here 
    childAnswer <- H.query unit $ left $ H.request AskChild 
    traceA $ fromMaybe "child not found" $ childAnswer 

    grandAnswer <- H.query unit $ right $ H.ChildF unit $ H.request AskGrandChild 
    traceA $ fromMaybe "grandchild not found" $ grandAnswer 

    pure next 
+0

아 같은 간단한 일 :

내가 함께 희망 일을 명확하게됩니다 자녀와 손자를 모두 쿼리의 인위적인 예를 넣었습니다! 나는 질의 대수가 어떻게 작동하는지 이해할 시간이 필요하다. 지금 나는 단지 카고 교련 일뿐입니다. – sportanova

+0

저는 조부모님이 여러 유형의 아이들을 가진 사례를 연구했습니다. 그것은 비교적 간단한 변화 일뿐 자신의 주를 요청할 수 있습니까? 다음은 예제입니다 https://gist.github.com/sportanova/e779fef9f27dbbe1097a064d231c7316 – sportanova

+0

그래,'queryPath '를 사용하여'ChildPath'를 지정할 수 있습니다 : https://gist.github.com/garyb/ 73cb5d0c586eb29b319d5859b3747638 –