2017-12-05 16 views
-2

私は現在ハスケルを学んでいますが、私は仕事に苦労しています。 不明なタイプのHaskell(basic)を表示

は、私が今やろうすべてが理解され、この

data STree a = BinS (STree a) a (STree a) | LeftS (STree a) a | RightS a (STree a) | LeafS a  

のように見える空でないバイナリツリーを持っているか、出力このツリーをします。私はちょうど出力に、私は私だけでは私が出力できる文字列には、この未知のタイプAを変換する方法を知らないこの

instance Show (STree a) where 
show (LeafS b) = show b 

をしようとした葉

のためのケースをしたい初めについて

。私はショー、プリント、私が考えることができるすべてを試みましたが、何も動作しません。

これは私が欲しいものであるツリーが唯一の後に整数が含まれていますが、私はタイプAでそれをしなければならない...

:葉2〜>「2」 葉「100」〜> " 100 "

+0

あなたは何か試しましたが、おそらくコンパイラは非常に有用なエラーメッセージを出して、なぜ動作しないのかを説明しました。 – user2407038

答えて

4

すべてのタイプがHaskellのshow nになることはできません。一部のタイプは本質的には表示できません。タイプInt -> Int - どのように表示されますか?しかし、いくつかのタイプはまだshowの実装を持っていません。だから一般的に、あなたが何も知らない何らかのタイプのaを持っているなら、それはshowであると仮定することはできません。

あなたのタイプaに機能showを使用するためには、タイプaShow aのインスタンスを持っていることを確認するようにコンパイラに依頼する必要があります。これを行うには、あなたはこのように、あなたのインスタンスに制約を追加:あなたはShow a =>を指定しているので

instance Show a => Show (STree a) where 
    show (LeafS b) = show b 
    ... 

、コンパイラは、場合にのみ場合は、指定されたタイプSTree aShowクラスのインスタンスであることを知っていますタイプaはそれです。これにより、コンパイラはshow bを呼び出すことができ、すべての型がわかったときにこの呼び出しが可能になることを確認します。面倒なことに、showのインスタンスをSTree aにしようとする人は、インスタンスShow aが存在することを確認する必要があります。そうでない場合、コンパイラはそれをチェックし、エラーを発行します。

+0

ありがとう!これは私の多くを助けた –

関連する問題