2010-11-22 10 views
10

'a'_lの違いは何ですか?'aと' _lの違いは何ですか?

私はこのエラーを見ていた、そしてそれを理解できませんでした:

Error: This expression has type ('a -> float polynomial) list but an expression was expected of type float polynomial list derivlist: ('_l → float polynomial) list 

答えて

23

_は弱い多型変数を表し:それが一般化することはできない位置にあります。

OCaml FAQに弱い多型に関する2つの説明があります:A function obtained through partial application is not polymorphic enoughと次の記事を参照してください。

これは一般的に、非ローカル参照(その型は一般化できません)を使用する場合や、構文的に機能しない多態関数を定義する場合に発生します(それらはfun x -> ..ではなく関数アプリケーションで始まります)。場合によっては、簡単な修正(η拡張、FAQを参照)があります。時にはそうではなく、時にはあなたのプログラムがちょうど不健全でした。

簡単な例:let a = ref []は、多型a list refタイプを取得しません。そうでない場合は、int listbool listの両方を使用し、参照を変更することによって異なるタイプの要素を混在させることができます。代わりに'_a list refタイプを取得します。これは、型が多形ではなく、単にが不明であることを意味します。。特定のタイプのaで何かを実行すると、'_aがすべて修正されます。値の制限と実際OCamlの型チェッカーに実装「緩和」値の制限の詳細な説明について

# let a = ref [];; 
val a : '_a list ref = {contents = []} 
# let sum_of_a = List.fold_left (+) 0 !a;; 
val sum_of_a : int = 0 
# a;; 
- : int list ref = {contents = []} 

、ジャックGarrigueの(2004)によってRelaxing the Value Restrictionペーパーを参照してください。

1

コンパイラからのエラーメッセージに弱いタイプの変数がありますが、弱い変数がエラーに関連しているとは確信していません(タイプ変数のステータスがこの原因になることはありませんメッセージ)。

polynomialの2つのタイプを定義していませんか?それはFAQ(FAQ)( "Error message: a type is not compatible with itself")の彼の答えでgasheが指摘した2つの質問のすぐ上の質問です。

関連する問題