0

パラメータとして抽象データ型を含む関数があります。私が使用したこの抽象データ型を同一視できるようにするために:

myfunction:: Eq x=> [x]->[x]->[x]

したがって、x の 2 つのリストを受け取り、[x] のリストを出力します。

ただし、別の関数から呼び出すと:

anotherfunction::[x] -> [x] -> [x]
anotherfunction a b = myfunction a b

それは言う

式 myfunction ab で、myfunction の使用から生じる (Eq x) のインスタンスはありません

ただし、コンソールから myfunction を呼び出すと、2 つの引数を使用して正常に動作します。

これを解決するにはどうすればよいですか?

4

2 に答える 2

10

Eqの型で使用しanotherfunctionます。

anotherfunction::Eq x => [x] -> [x] -> [x]
anotherfunction a b = myfunction a b

myfunctionクラス内の型でのみ機能しますEq。しかし、anotherfunctionクレームの現在の定義は、どのタイプでも機能します。これは、クラスにないanotherfunction型で呼び出した場合に問題を引き起こします- を呼び出すことはできません。Eqmyfunction

于 2012-09-08T12:33:55.010 に答える
2

myfunction:: Eq x=> [x]->[x]->[x]

ここで、xにはEqクラスのインスタンス宣言が必要です。

anotherfunction::[x] -> [x] -> [x]
anotherfunction a b = myfunction a b

ここでは、タイプとがクラスに属することをmyfunction前提としていますが、タイプにはそのような制約はありません。abEqanotherfunction

正しい方法は、この制約anotherfunctionもで指定することです。

anotherfunction:: Eq x => [x] -> [x] -> [x]
anotherfunction a b = myfunction a b

混乱している場合、最も簡単な方法は、タイプを指定せずにanotherfunction ファイルをghciにロードして、どのタイプが推測されるかを確認することですanotherfunction

> :t anotherfunction 
anotherfunction :: Eq x => [x] -> [x] -> [x]

ghcは最も一般的な型を推測するため、型をより具体的にしたい場合は、xに明示的な型を指定することをお勧めします。好き

anotherfunction :: [Int] -> [Int] -> [Int]

ここではEq、のインスタンスIntがすでに定義されているため、エラーは発生しません。したがって、ポリモーフィック型xを特定の型に割り当てる場合は、制約されたクラスのインスタンスがあることを確認する必要があります。

于 2012-09-08T13:01:20.577 に答える