2

私は次のタイプエイリアスを持っています

data    Bindable  = Const Value 
                      | Variable Location
                    | Func Function
                    | Proc
              deriving (Eq, Show)                                   

type Function = Argument -> Store -> Value

しかし、コンパイラは私にエラーを出します

No instance for (Show Function)
arising from the 'deriving' clause of a data type declaration
Possible fix:
add an instance declaration for (Show Function)
or use a standalone 'deriving instance' declaration,
   so you can specify the instance context yourself
When deriving the instance for (Show Bindable)

関数のShow&Eqを定義できますか?そうでない場合、解決策は何でしょうか?Eqを定義し、引数、ストア、および値に表示する必要がありますか?

4

2 に答える 2

6

data型クラス インスタンスは、 ornewtype宣言で定義されているように、「実際の」型に対してのみ定義できます。宣言は「偽のtype」型であり、より長い型の省略形です。

しかし、それはこの場合の問題 1 にすぎません。問題#2は、これをしても...

newtype Function = Function (Argument -> Store -> Value)

Show... の真に有用なインスタンスはまだないかもしれませんFunction。関数を文字列に変換するにはどうすればよいですか? 2 つの戦略があります。まず、「ただあきらめる」戦略:

instance Show Function where
    show _ = "<some Function, no clue what it does>"

第二に、「正規の例」戦略では、Functionをいくつかの正規にArgument適用し、これらを結果Storeとともに表示します。Value

instance Show Function where
    show (Function fn) = "Function: " 
                      ++ show defaultArgument 
                      ++ " -> " 
                      ++ show defaultStore
                      ++ " -> " 
                      ++ show (fn defaultArgument defaultStore)

ここでの考え方はFunction、1 つの特定の引数/値マッピングとして表示することです。これにより、すべての定数文字列に同じ定数文字列を使用するよりも、より正確に識別することができます。これが役立つかどうかは、関数が何をするかによって異なります。

しかし今、問題 #3 があります: これらのどちらもShowReadクラスのインテント/コントラクトに従いません。これはread (show x)と同等xです。(しかし、人々はしばしばこの意図を無視します。それは、何かを印刷したいという理由と、それShowが最も迅速なチケットであるという理由だけです。Thomas DuBuisson が指摘するようにText.Show.Functions、「ただあきらめる」戦略を実装する標準モジュールが存在するほどです。)

クラスに関してEq言えば、答えは、2 つの関数が等しいかどうかを比較することは一般に不可能だということです。(私の記憶が正しければ、それは停止問題を解くことと同じですが、それについては引用しないでください。) 解決策で関数を比較して同等性を求める必要がある場合は、新しい解決策が必要です...

于 2013-02-22T02:19:10.263 に答える
5

インポートするだけText.Show.Functionsです。Yourtypeは単なるエイリアスです。エラー メッセージは、 Show のインスタンスが見つからないことを示しています(->)が、インスタンスはそのモジュールで使用できます。

Prelude> import Text.Show.Functions
Prelude Text.Show.Functions> show (+1)
"<function>"
于 2013-02-22T02:12:48.000 に答える