2014-04-26 2 views
1

일부 정규 구조의 큰 트리 (또는 포리스트)를 모델링하려고합니다. 트리는 작은 트리 (불규칙 부분) 및 (즉) 많은 매개 변수 목록으로 분해 될 수 있습니다. 각 노드는 큰 나무의 노드를 만듭니다.데이터, 유형 및 함수를 함께 바인딩

그래서 나무의 각 노드가 많은 노드를 나타내는 데이터 구조가 필요합니다. 그리고 실제 노드는 유형 (노드, 매개 변수)입니다.

해당 종류의 나무에서 작동하는 알고리즘의 경우 해당 매개 변수가 중요하지 않습니다. 그들은 그냥 자리 표시 자입니다. 그러나 일부 데이터는 일반 매개 변수 또는 노드와 매개 변수의 조합에서 추출 할 수 있어야하며 모든 가능한 매개 변수는 반복 가능해야합니다. 모든 종류의 데이터는 apriori로 알려져 있으며, 그 트리의 의미를 반영합니다.

그래서 실제 유형, 의미 및 매개 변수는 트리의 구현에 달려 있습니다.

params 유형에 중첩 된 typedef를 사용하고, 알고리즘에 사용할 수있는 모든 종류의 것들에 대한 고정 메소드 이름 (이 두 가지 개념을 함께 사용)과 알고리즘 자체에 대한 템플릿을 사용하여 C++로 모델링합니다.

e.e. 큰 트리의 각 노드와 정수를 연관 시키려면 함수 int data(const node& n, const param& p)을 제공하고 param은 중첩 된 typedef로 사용할 수 있으며 알고리즘은 사용 가능한 모든 매개 변수의 목록을 가져올 수 있으며 data을 관심있는 노드와 각 매개 변수로 호출 할 수 있습니다 이

data Tree = Node [Tree] | Leaf 

가 지금은 패키징 할 같은


나는, 일부 일반 데이터 유형, 즉 트리 데이터를 가지고 :

  • 콘크리트 트리
  • 몇 가지 유형 (즉, 콘크리트) 트리 노드 (즉)에서 작동
  • 일부 기능은 그래서 하나는이 패키지 사용하는 일부 기능을 쓸 수

값 유형의 일부 값

  • 일반 유형과 같은 유형 및 기능을 제공합니다.

    어떻게 달성할까요? 형 가족과 함께


    나는 형의 가족이 typeclass 인수에 따라 자신의 회원의 유형을 원하기 때문에 지금 Tree t

    class PackagedUp t where 
        type Value t 
    
        tree :: Tree t 
        values :: [Value t] 
        f :: Tree t -> Value t -> Int 
    

    Tree왔다.

    또한, 주사제를 다루는 유형 계열은 https://stackoverflow.com/a/16927632/1227578과 같이 필요합니다. 이와

    나는

    instance PackagedUp MyTree where 
        type Value MyTree = (Int,Int) 
        tree = Leaf 
        values = [(0,0),(1,1)] 
        f t v = fst v 
    

    어떻게

    는 이제 함수를 작성 할 수 있습니까? 나는. 나무의 근원을 이루는 함수, 모든 값은 [Int] 모두 f tree value입니다.모든

  • +0

    'Tree'에 대한 정의는 원하는 것이 아니며, 문제를 해결하기 위해 가족을 입력 할 필요가 없다고 확신합니다. 그러나 유용한 답변을 제공하기 위해서는'f'가 원하는 것을 알 필요가 있습니다. 코드에서 명확하지 않기 때문입니다. – duplode

    +0

    사실 어떤 종류의 게임 트리를 모델링하고 싶습니다. 문제의 설명을 드리겠습니다. 저는 이미 C++에서 그렇게했으며, 지금은 하스켈로 이식하려고합니다. 왜 그런지 묻지 말아주세요) –

    +0

    나는 당신이 복잡하게 생각합니다. 번들하려는 내용으로 모듈을 만드십시오. – augustss

    답변

    2

    먼저, 당신의 나무 유형은 다음과 같이 정의한다 : 위의

    data Tree a = Node a [Tree a] | Leaf 
    

    유형은 다형성이다. 우리가 일반적인 유형 (예 : C# 또는 Java에서 Tree<A>으로 작성할 수 있음)으로 불리는 것과 유사한 의미 체계가 사용됩니다. Tree a의 노드는 a 유형의 값과 하위 트리 목록을 보유합니다.

    다음으로 우리는 PackagedUp이됩니다. 하스켈의 수업은 같은 이름의 객체 지향 개념과는 관련이 거의 없습니다. 그것들은 데이터와 행동을 함께 묶는 것이 아닙니다. 상황이 실제로 훨씬 간단하다 : 당신이 당신의 나무 유형에 해당하는 함수를 정의하기 만하면 모든

    getRoot :: Tree a -> Maybe a 
    getRoot Leaf  = Nothing 
    getRoot (Node x _) = Just x 
    

    (Maybe a를 반환하는 형태의 안전성과 실패를 처리하는 간단한 방법입니다 정중 사촌으로 Nothing 가치를 생각하십시오. null null 참조 예외로 폭발하지 않습니다.)

    클래스를 잘 유형화하는 것은 사용자가 암시 한 것과 같은 데이터 구조 알고리즘 인터페이스를 표현하는 것입니다. 가장 일반적인 클래스 중 하나는 Functor이며 데이터 구조에 매핑하기위한 일반 인터페이스를 제공합니다. 그것은

    fmap :: (a -> b) -> Tree a -> Tree b 
    

    과 (fmap f ts에서와 같이) 목록이

    fmap :: (a -> b) -> [a] -> [b] 
    
    이되고 함께 전문, 당신의 나무와

    fmap :: Functor f => (a -> b) -> f a -> f b 
    

    :

    instance Functor Tree where 
        fmap f Leaf  = Leaf 
        fmap f (Node x ts) = Node (f x) (fmap f ts) 
    

    fmap은 다음과 다형성 유형이

    마지막으로, Data.Tree 모듈은 정의하려는 것과 매우 흡사하게 보이는 데이터 구조를 제공합니다.

    +0

    내가 원하는 것은 인터페이스입니다. 그리고 가장 가까운 것은 C++의 개념입니다. 저는 이것을 사용했고 haskell에 클래스를 입력했습니다. –

    +0

    @MikhailCheshkov 추상화하려는 여러 데이터 유형이 있다면 인터페이스가 필요합니다. 'Functor '는 그 의미에서 인터페이스입니다. fmap은 나무와리스트 및 다른 많은 데이터 구조와 작동하기 때문입니다. 그러나 귀하의 경우에는 단 하나의 데이터 유형 만 가지고 있으므로 추상화하기 위해 유형 클래스가 필요하지 않습니다. 'Tree a'를 취하거나 리턴하는 함수의 다형성으로 충분합니다. 예를 들어, 위에서 정의한'getRoot'는 어떤 타입의 요소를 포함하는 나무에서도 작동합니다. – duplode

    +0

    나는 함수가'data'의 멤버가 될 수 있다는 것을 깨달았습니다. 그래서 구현과 호출을'class'없이 분리 할 수 ​​있습니다! –