2

私はdataタイプを持っています:

data BuildException a = KillBuild JobID a Stage
                      | FailBuild JobID a Stage
                      | CancelBuild JobID a Stage
                      | StopBuild JobID a Stage
                         deriving Typeable

ここで、はクラスFooのインスタンスを持っている必要があります。(おそらくRWHで)data定義にクラス制約を含めることは可能でしたが、それは望ましくなかったことを読んだことを覚えています。それでは、これを行うための適切な方法は何ですか?

4

2 に答える 2

5

必要な関数に型制約を適用するだけです。例えば:

makeException :: Foo a => String -> BuildException a

制約を必要としない関数もあるFooかもしれません。これにより、API のクライアントが制約を定義することなくそのサブセットを使用できるようになる可能性がありますFoo! それがデータレコード定義の一部である場合、それは不可能です。

于 2012-07-20T19:48:48.053 に答える
1

あなたは正しく読みました。しかし、Haskell 2010 では、この機能は役に立たないため削除されました。データ型で制約を指定することもできましたが、すべての関数も同じ制約を持つ必要があったため、実際には意味がありませんでした。したがって、この機能は完全に役に立たないため削除されました。

前述のように、関数で制約を指定するだけです。ただし、制約を必要としない関数には制約を指定する必要がないことに注意してください。特に、そのような無制限の関数は制約付きバージョンの一般化であるため、作成関数は、必要でない場合は必ずしも制約に限定する必要はありません。これは、それを引数として取る関数に適用されますが、そのような関数は実際に制約を必要とする可能性がはるかに高くなります。

于 2012-07-21T15:07:57.853 に答える