関数を含むレコード タイプがあります。
{foo : int; bar : int -> int}
このタイプには構造的な平等が必要です。bar
等式テストで無視する必要があることをマークできる方法はありますか? または、これを回避する他の方法はありますか?
関数を含むレコード タイプがあります。
{foo : int; bar : int -> int}
このタイプには構造的な平等が必要です。bar
等式テストで無視する必要があることをマークできる方法はありますか? または、これを回避する他の方法はありますか?
このトピックに関するDonのブログ投稿、特にカスタムの同等性と比較のセクションを参照してください。
彼の例は、あなたが提案するレコード構造とほとんど同じです。
/// A type abbreviation indicating we’re using integers for unique stamps on objects
type stamp = int
/// A type containing a function that can’t be compared for equality
[<CustomEquality; CustomComparison>]
type MyThing =
{ Stamp: stamp;
Behaviour: (int -> int) }
override x.Equals(yobj) =
match yobj with
| :? MyThing as y -> (x.Stamp = y.Stamp)
| _ -> false
override x.GetHashCode() = hash x.Stamp
interface System.IComparable with
member x.CompareTo yobj =
match yobj with
| :? MyThing as y -> compare x.Stamp y.Stamp
| _ -> invalidArg "yobj" "cannot compare values of different types"
元の質問に具体的に答えるために、インスタンス間の比較が常に true であるカスタム タイプを作成できます。
[<CustomEquality; NoComparison>]
type StructurallyNull<'T> =
{ v: 'T }
override x.Equals(yobj) =
match yobj with
| :? StructurallyNull<'T> -> true
| _ -> false
override x.GetHashCode() = 0
その後、次のように使用できます。
type MyType = {
foo: int;
bar: StructurallyNull<int -> int>
}