2017-03-15 3 views
1

私は、バイナリツリーを印刷する機能を構築しようとしているので、私はこれでした:show instaceを呼び出してバイナリツリーを表示するにはどうしたらいいですか?

instance Show a => Show (Tree a) where 
    show Null = "_" 
    show (Nod x e d) = "(" ++ show x ++ " " ++ show e ++ " " ++ show d ++ ")" 


left :: Tree a -> Tree a 
left (Nod x e d) = show e 

を、私はこのメッセージを受信して​​います:

Couldn't match type `[Char]' with `Tree a' 
Expected type: Tree a 
    Actual type: String 
In the return type of a call of `show' 
In the expression: show e 
In an equation for `left': left (Nod x e d) = show e Failed, modules loaded: none. 
+0

ヒント:あなたの 'left'関数の結果の型は何でしょうか、あなたが書いた型シグネチャには何が書かれていますか? – duplode

+0

私はツリーの左側を取得しようとしているので、ツリーを受け取って別のツリーである左の子を返します – Marcio

+1

左のサブツリーを返すように 'left'をしたいのであれば、 'show'は' String'を生成します。 – duplode

答えて

0

あなたのタイプと値不一致です。関数left :: Tree a -> Tree aTree aを返しますが、関数本体show eStringshow :: Show a => Tree a -> String)を返します。

ツリーをstdoutに出力する関数を必要とする場合は、IOを行う関数と、ツリーの要素がShowのインスタンスであることがわかるようにShowという制約が必要です。 left :: Show a => Tree a -> IO()と体は次のようになります:なるようにleft (Nod x e d) = print eprint :: Show a => a -> IO()

あなたは木を取り、Stringとしての左側を返す関数をしたい場合は、Stringに、関数の結果の型を変更する必要があります上記のShowという制約を追加してください:left :: Show a => Tree a -> String、あなたの体はあなたのものとまったく同じです。あなたは木を取り、ツリーとしての左側を返す関数を使用する場合は

、あなたが持っているタイプの署名を維持する必要がありますが、あなたはに変換されていないので、(身体からshowを削除しますa String):left (Nod x e d) = e

関連する問題