2017-02-03 7 views
0

ハスケルにはツリーを構築するためのdata構造があります。その場合ツリー:サブオプションのオプション番号

data MultTree b = DataNode b | IndexNode Int Int (MultTree b) (MultTree b) (MultTree b) deriving (Show) 

パラメータとして3 MultTree'sを必要とIndexNodeを持っていることだけが可能です。

IndexNodeに0,1,2,3を受信させるにはどうすればよいですかMultTree's? 異なる数のパラメータを使用してIndexNodeを実装することは機能していないようです。

だから、最後に私はそのようなツリーを作成したいと思います:あなたはまだすべての引数を提供する必要がありますが、ノード

data MultTree b = DataNode b 
       | IndexNode Int Int (Maybe (MultTree b)) (Maybe (MultTree b)) (Maybe (MultTree b)) 

t2 :: MultTree Int 
t2 = IndexNode 3 42 (IndexNode 3 15 (3) (11) (12)) (IndexNode 19 42 (42) (23)) 

答えて

2

ゼロ〜​​3のものを含む、独自のタイプを定義します要求されたよう

data From0To3 a = Zero | One a | Two a a | Three a a a 
    deriving (Show) 
data MultTree b = DataNode b | IndexNode Int Int (From0To3 (MultTree b)) 
    deriving (Show) 

t2 :: MultTree Int 
t2 = IndexNode 3 42 
    (Two (IndexNode 3 15 
      (Three (DataNode 3) (DataNode 11) (DataNode 12))) 
      (IndexNode 19 42 
      (Two (DataNode 42) (DataNode 23)))) 

は、ここでは、このようなツリーを分析する方法を説明します。たとえば、次の例はツリーの高さを計算します。

height :: MultTree a -> Int 
height (DataNode _)   = 1 
height (IndexNode _ _ Zero) = 1 
height (IndexNode _ _ (One t1)) = 
    1 + height t1 
height (IndexNode _ _ (Two t1 t2)) = 
    1 + (height t1 `max` height t2) 
height (IndexNode _ _ (Three t1 t2 t3)) = 
    1 + (height t1 `max` height t2 `max` height t3) 

パターンマッチングのこの種を書くとき、私は強く、我々はケースを処理するのを忘れた場合GHCが私たちに教えてくれますように警告(-Wall)をオンにすることをお勧めします。

+0

偉大な答え!既存のツリー上で再帰をしたい場合に、サブツリーを取得する方法を説明すると、気が散るでしょう。 – jublikon

+0

@jublikonが編集されました。 – chi

+0

ありがとう! _はどういう意味ですか?私はリストの演算子を理解していますが、ここでは構文を見ることができません。 – jublikon

2

各1 Maybeを作ります1人の子供だけがIndexNode 3 6 Nothing (Just (DataNode "hi")) Nothingのようになります。

代わりに、あなたは単にIndexNodeMultTree値のリストを取り、唯一IndexNodeが追加されているMultTree値の数をチェックし、スマートコンストラクタによって作成することを可能にすることを指定することができます。

data MultTree b = DataNode b | IndexNode Int Int [MultTree b] 

mkIndexNode :: Int -> Int -> [MultTree b] -> MultTree b 
mkIndex x y nodes | length nodes > 3 = error "Too many nodes" 
        | otherwise = IndexNode x y nodes 

エラーを、部分的な機能を扱う望ましい方法で置き換えることができます。 (MaybeEitherなど)

関連する問題