ここに私のADTがあります:
data Tree a = Val Integer
|Tree a
|Variable a
2 つの質問があります。
質問 1: Tree String型を使用していくつかの木を表現しますか?
質問 2: データ型Tree Stringの要素であるツリーを string に変換する関数を定義します: showTree::Tree String -> String
ここに私のADTがあります:
data Tree a = Val Integer
|Tree a
|Variable a
2 つの質問があります。
質問 1: Tree String型を使用していくつかの木を表現しますか?
質問 2: データ型Tree Stringの要素であるツリーを string に変換する関数を定義します: showTree::Tree String -> String
ツリーを文字列に変換する2番目の質問に関しては、関数を導出Show
して使用するだけshow
です:
data Tree a = Val Integer
| Tree a
| Variable a
deriving (Eq, Ord, Show)
showTree :: (Show a) => Tree a -> String
showTree = show
あなたの最初の質問がよくわからないので、私の言うことが役に立てば幸いです。
「ツリー」データ型は実際にはツリーではないことを理解してください。これは、整数または型変数に一致する型によってインスタンス化できる単なる合計データ型ですa
。2 番目のコンストラクター はTree
、実際にはデータ型を再帰的にしていません。コンストラクター名と同じように、単なるVariable
コンストラクター名です。おそらくサブツリーが必要だと思います(Tree
コンストラクターではなくタイプとして使用することにより)-タイプを次のように定義しましょう:
data Tree a = Val Integer
| Branch (Tree a) (Tree a)
| Variable a
Branch
これで、左右のサブツリーを持つという名前のコンストラクターができました。変数が s であると想定されている場合、これを表すためにString
使用できます。Tree String
myTree :: Tree String
myTree =
let leftBranch = Variable "x"
rightBranch = Branch (Val 3) (Variable "y")
in Branch leftBranch rightBranch