2017-11-11 10 views
2

私はShowクラスのインスタンスを作成しましたが、希望の結果が得られません。私はderiving言葉を使ってショーのクラスのインスタンスを作成しようとした場合、それは動作しますが、同様にしようとした場合:haskellのインスタンスとインスタンスの相違点

instance Show (SomeValue v) where 
    show (Null) = "You have no value" 
    show (Justs v) = show (Justs v) 

findKey key = foldr (\(k,v) acc -> if key == k then Justs v else acc) Null 

それは(一種の)非終了ループに入ります。私は、上記のコードに何が問題なのかをderivingという言葉を使って知ると、デフォルトの実装がうまくいくと思いますか?それはコンパイルされますが、何も印刷されません。

このような値を印刷することは可能ですか(「ジャスト」なし)?

instance Show (SomeValue v) where 
    show (Null) = "You have no value" 
    show (Justs v) = show (v) 
+0

関連:https://stackoverflow.com/questions/28665917/accessing-the-default-show-in-haskell –

+0

@WillemVanOnsem同じではありません。私のデータコンストラクタの場合、私は2つの値しか持たず、これらの値の両方に対してshowを定義していますが、何も出力しません。型の注釈を使って読み込みしようとしましたが、うまくいきません:) –

+0

もちろん何も印刷しない、無限ループに詰まっている。 –

答えて

3

コード

show (Justs v) = show (Justs v) 

はない

f x = f x 

同じ理由で無限ループに入ります。あなたが尋ねたとしてあなたはJustsせずにそれを書くことができます

、あなただけのインスタンス


instance (Show v) => Show (SomeValue v) where 
    show Null = "You have no value" 
    show (Justs v) = show v 

上の制約を必要とするあなたはvを表示しようとしている場合ので、vはありません、showableすべきですか?

関連する問題