2009-07-20 15 views
4

私はDebug.Trace.traceを使用して、私が知っているものをShowとして印刷したいと考えています。私はPythonで行うだろうと同じようになどHaskell:任意のdebugShow関数?

一つの解決策は、など、

しかし、それを、私はトレースを配置する機能の署名に「Show a =>」を追加することであり、それを呼び出す任意の関数に値が1であればshowを呼び出す関数debugShowを使用することができればもっと良いでしょう。それ以外の場合は"--no show--"などが返されます。

{-# LANGUAGE FlexibleInstances, UndecidableInstances, OverlappingInstances #-} 

class DebugShow a where 
    debugShow :: a -> String 

instance Show a => DebugShow a where 
    debugShow = show 

instance DebugShow a where 
    debugShow = const "--no show--" 

「安全でないキャスト」のいくつかの種類にも私の問題を解決するだろう:

はここDebugShow(GHCが"Duplicate instance declarations"を拒否)を定義するために私の失敗した試みです。

アドバイスはありますか?

注 - これはデバッグの目的にのみ使用します。私は完成したコードでこれを使用していません。

答えて

3

私は絶対にこれを確信しているわけではありませんが、各タイプ変数が決定されるコールサイトとコールサイトの間のコールチェーン全体にクラスコンテキストを追加しなければ、これは不可能と思います。この理由は動作しています。少なくともGHCでは、各クラスは辞書で実装されています。したがって、使用サイトではaの辞書がある場合はShow辞書が必要です。しかし、これを得るには、aが決定されたサイトから渡されている必要があります。これには、すべての中間関数の署名に何かが必要です。 --no show--「そう返し、呼び出しは値が1を持っているかどうかを示す 『Debug.Trace

制約で定義された

traceShow :: (Show a) => a -> b -> b 
traceShow = trace . show 

』か何か:

1

「安全でないキャスト」は、unsafeCoerceとして知られています。 documentationの警告を守ってください。クラッシュやその他の不正な動作を引き起こす簡単な方法です。

+0

@ephemient:ありがとうございます。この場合、特定の型に "unsafeCoerce"を "キャスト"することができますが、同じ未知の型に "キャスト"し、そのコンテキストに 'Show'を追加したいと思います。私は "debugShow = show。unsafeCoerce'を定義しようとしましたが、"あいまいな型変数 "のために失敗しました。 – yairchu

4

はおそらく、あなたはいくつかのバリエーションが欲しいです"難しいです。すべてのタイプ(デフォルトではunsafeCoerce経由、または真空経由)でデフォルトのShowを定義するには、重複した(そして非干渉性の)インスタンスが必要です。

+0

@dons:あなたはvacuumを使って言うとき、どういう意味ですか?それはできないと言っているのでしょうか? – yairchu

+3

@yairchu私は真空を意味します:ヒープオブジェクトをレンダリングするhttp://hackage.haskell.org/packages/archive/vacuum/0.0.95/doc/html/GHC-Vacuum.html#v%3Avacuum(つまり、 a Show辞書) –

+0

@dons:クール!これはデバッグに便利です:) – yairchu

0

DebugShowクラスのデフォルトメソッド実装をそのまま使用してください。これはあなたが望むものを正確に行うはずです。

{-# LANGUAGE FlexibleInstances #-} 
{-# LANGUAGE UndecidableInstances #-} 

class DebugShow a where 
    debugShow :: a -> String 
    debugShow = const "--no show--" 

instance Show a => DebugShow a where 
    debugShow = show 
関連する問題