次のデータ型を のインスタンスにする必要がありますShow
。
data Tree a b = Branch b (Tree a b) (Tree a b) | Leaf a
私はこれにかなり慣れていませんが、まず、この宣言を次のように解釈しました
「ツリーと呼ばれる新しいタイプを作成しました。これは、タイプ a と b でパラメータ化されています。ツリーは、タイプ b のデータを保持するブランチと、さらに 2 つのツリー、または保持するリーフのいずれかになります。タイプaのデータ項目。」
今、私はそれをうまく「表示」する方法を作る必要があります (ネストされたブランチなど) deriving
。これまでのところ、モジュール Main で関数を記述し、インタープリター ウィンドウでそれらを読み込んで再生するだけでした。そのため、コンストラクターなどで実際に行ったことはありません。それにもかかわらず、質問の冒頭に示されているように、ファイル内でツリーのデータ型を宣言することから始めて、そこから始めることができると考えました。
「表示」をいじってあまり成功しなかったので、ツリー全体を操作する前に、ツリーの小さなコンポーネントとそれを「表示」する方法を最初に定義する必要があるのではないかと考えました。
data Leaf a = Leaf a
instance Show (Leaf a) where
show (Leaf a) = ???
私は???で多くのことを試しました 「a」、a だけ、putStrLn などのスポットですが、次のようなことを言ったときに a の値を出力するものはありません
>show (Leaf 3)
実際、私は多くの場合これに遭遇しました。これはおそらく、物事を正しく見つけていないことを意味します。
Ambiguous occurrence `show'
It could refer to either `Main.show', defined at a2.hs:125:1
or `Prelude.show',
imported from `Prelude' at a2.hs:2:8-11
(and originally defined in `GHC.Show')
...「Main.show」を呼び出して対処しましたが、もちろん機能しません。
問題は、これらすべてをどこに持ち込めばよいかということだと思います...あるいは単に、「リーフの「表示」ユーティリティを拡張する方法を理解できるようにするにはどうすればよいでしょうか?」(最初に定義する必要があると仮定します...)