5

F# での値の制限に関するトレッドをすべて読みましたが、まだ理解できません。次のコードがあります。

type tree<'a> = 
    | Nil
    | Node of (tree<'a> * 'a * tree<'a>)

let rec flatten = function
    | Nil -> []
    | Node ( Nil, b, Nil ) -> [b]
    | Node ( l, h, p ) -> List.concat [(flatten l);[h];(flatten p)]

そしてコンパイラはエラーを表示します:

error FS0030: Value restriction. The value 'it' has been inferred to have generic type
    val it : '_a list    
Either define 'it' as a simple data term, make it a function with explicit arguments or, if you do not intend for it to be generic, add a type annotation.

誰でも私を助けることができますか?どうもありがとうございました;)

4

1 に答える 1

11

私の精神的なデバッグスキルを使わせてください。flatten Nilコンパイラが示すように、結果は'a listfor any typeになる可能性があるため、呼び出すことはできません'a。などの型注釈を追加する必要があります(flatten Nil : int list)

無関係なメモとして、flatten の定義の 2 番目のケースは不要であり、3 番目のケースでもカバーされているため削除できます。

于 2010-11-01T19:21:03.323 に答える