型の引数にレコード型であり、特定のプロパティが必要な汎用関数を作成しようとしています。特定のプロパティを持つレコード型のF#型制約
let foo<'a> (a : 'a) =
a' = { a with bar = "baz" }
a'
私はThe record label bar is not defined
を示すエラーを取得し、これをコンパイルする:ここでは、関連するコンパイラエラーが発生したサンプルです。
:
let foo<'a when 'a : (member Id : string)> =
// ...
をそれは
This code is not sufficiently generic. The type variable ^a when ^a : (member get_Int : ^a -> string) could not be generalized because it would escape its scope.
は私がこれを適切にやらせるだろう型制約を指定する方法があることを訴えて、どちらかのコンパイルされませんでした?
まず、関数は静的に制約されるためにインラインでなければなりません。そのプロパティを持つレコードの特定のプロパティを読み取る関数を作成することはできますが、複製するには静的に制約された '' with''構文を使用できません。あなたはその時点で反射のようなものが必要です。 – Gustavo
レンズを見るべきです。 –
@FyodorSoikin私はレンズがこれを解決するとは思わない。多形レンズでさえない。前に述べたように、AFAIKはメンバ '' bar''の静的メンバ拘束を使って '' bar = ..''構造体を呼び出す方法はありません。 – Gustavo