2017-03-07 11 views
1

私はlikeso逆の機能を定義した場合:入力チェックをしませんOCamlの型システムの微妙:多型、pointfree逆、およびネストされたリスト

let reverse = 
    let rec helper out = function 
    | [] -> out 
    | a :: l -> helper (a :: out) l 
    in helper [] 
その後

reverse (List.map reverse xs)、エラーでの

Error: This expression has type 'a list list 
    but an expression was expected of type 'a list 
    The type variable 'a occurs inside 'a list 

しかし、それを明示的な引数で定義します。

let reverse l = 
    let rec helper out = function 
    | [] -> out 
    | a :: l -> helper (a :: out) l 
    in helper [] l 

が動作します。

ここでは何が起こっていますか?

答えて

3

あなたの元の定義:それはアプリケーション(すなわち、helper [])の形ではなく、ラムダを有するので

# let reverse = 
    let rec helper out = function 
     | [] -> out 
     | a :: l -> helper (a :: out) l 
     in helper [];; 
val reverse : '_a list -> '_a list = <fun> 

半有名な値の制限を受けます。

第2の定義は、値制限の対象ではないラムダの形をしています。

これ以降はすべてが続きます。

値の制限はStack Overflowで何度も議論されています。そのような議論の1つはThe value restrictionです。簡単な要約は、変更可能な値(参照など)がある場合に、多型を作成するための何らかの種類の制限が必要であるということです。値の制限は、でもの制限なしに覚えやすい妥協の一種です。

私は、値制限は、私は頻繁にこの論文を参照してください(定期的に起こるもの)すべてに約あるか忘れて起動すると:Jacques Garrigue, Relaxing the Value Restriction

関連する問題