15

関数を含むレコード タイプがあります。

{foo : int; bar : int -> int}

このタイプには構造的な平等が必要です。bar等式テストで無視する必要があることをマークできる方法はありますか? または、これを回避する他の方法はありますか?

4

2 に答える 2

20

このトピックに関する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"
于 2012-06-09T03:03:58.437 に答える
13

元の質問に具体的に答えるために、インスタンス間の比較が常に 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> 
}
于 2014-01-06T09:31:08.750 に答える