木のラベル

Labels of a tree

出典: link タグ:listhaskelltree 更新時間:

  問題

次のデータ型

 data Tree a = Node a [Tree a]
 

私は次の関数を作成したいと思います:

 labels:: Tree a -> [a]
labels (Node label children) = label: (map labels children)
 

しかし、このfalsは

    * Occurs check: cannot construct the infinite type: a ~ [a]
      Expected type: [a]
        Actual type: [[a]]
 

x:xsとして子供を持つことは、xsはまだツリーのリストであり、単一のツリーではありません。

  ベストアンサー

あなたの関数labelsにはTree a -> [a]というタイプがあります。つまり、map labelsを構築すると、タイプmap labels :: [Tree a] -> [[a]]があります。したがって、[[a]]の代わりにリスト[a]を生成するように、これらの項目を連結する必要があります。

代わりに concatMap :: Foldable f => (a -> [b]) -> f a -> [b] を使うことができます:

 labels :: Tree a -> [a]
labels (Node label children) = label : concatMap labels children 

x:xsとしてchildrenを持つと、xsはまだ1つのツリーではなくツリーのリストになります。

確かに、(x:xs)を使用すると、(不要な)子供の空のリストを持つツリーに自分自身を制限します。 xxs(x:xs)の「特別な」変数名であるという一般的な誤解です。 "cons"データコンストラクタ(:)でパターンマッチします。

  同じタグがついた質問を見る

listhaskelltree