2 Stimmen

Vergleich/Gleichheit bei einem privaten Gewerkschaftstyp aufdecken

Ich habe Schwierigkeiten, Vergleich/Gleichheit bei einem Union-Typ darzustellen, dessen Fälle ausgeblendet sind. Dies ist, was ich mit begonnen:

Modul.FSI

type A<'T when 'T : comparison>

Modul.FS

type A<'T when 'T : comparison> = A of 'T list

Programm.FS

[<StructuralEquality;StructuralComparison>]
type B =
    | Case1
    | Case2 of Module.A<char>

Aber ich erhalte die Fehlermeldung:

The struct, record or union type 'B' has the 'StructuralComparison'
attribute but the component type 'Module.A<char>' does not satisfy the
'comparison' constraint

Ich habe versucht, die benutzerdefinierte Gleichstellung auf A zu verwenden:

Modul.FSI

[<CustomEquality;CustomComparison>]
type A<'T when 'T : comparison>
  with
    interface System.IComparable
    override Equals : y:obj -> bool
    override GetHashCode : unit -> int
  end

Modul.FS

[<CustomEquality;CustomComparison>]
type A<'T when 'T : comparison> = A of 'T list
    with
        override x.Equals y = ...
        override x.GetHashCode() = ...
        interface System.IComparable with
            member x.CompareTo(y) = ...

Aber ich verstehe das:

This construct is deprecated: The syntax 'type X with ...' is reserved 
for augmentations. Types whose representations are hidden but which have
 members are now declared in signatures using 'type X = ...'.

Ist dies der richtige Weg, um einen Vergleich von einem Gewerkschaftstyp mit privaten Fällen aufzudecken? Wie lautet die korrekte Syntax dafür in Signaturdateien?

2voto

Tomas Petricek Punkte 233658

Die Fehlermeldung besagt nur, dass die korrekte Syntax für die FSI-Dateideklarationen Folgendes verwenden sollte = (wie in der Implementierungsdatei) anstelle der with ... end Syntax. Damit ist das Problem jedoch nicht wirklich gelöst. Nach einigen Experimenten denke ich, dass Sie die Attribute in der FSI-Datei nicht anwenden müssen:

// Mod.fs
namespace Mod

[<CustomEquality; CustomComparison>] //; CustomEquality>]
type A<'T when 'T : comparison> = 
  | A of 'T list    
  override x.Equals y = compare x (y :?> A<_>) = 0
  override x.GetHashCode() = -1
  interface System.IComparable with
    member x.CompareTo(y) = compare x (y :?> A<_>)

// Mod.fsi
namespace Mod

[<Sealed>]
type A<'T when 'T : comparison> =
  interface System.IComparable
  override Equals : obj -> bool
  override GetHashCode : unit -> int

Das sollte genügen - leider bin ich mir nicht sicher, ob es eine Möglichkeit gibt, automatisch generierte strukturelle Gleichheit zu verwenden und gleichzeitig die Implementierung der diskriminierten Gewerkschaft zu verbergen.

EDITAR Es sieht so aus, als könnten Sie die diskriminierten Gewerkschaftsfälle in der FSI-Datei angeben, sie aber als private so dass sie außerhalb des Moduls nicht sichtbar sind. Vielleicht würde dies also auch funktionieren:

// Mod.fsi
namespace Mod

type A<'T when 'T : comparison> = 
  private | A of 'T list    

// Mod.fs
namespace Mod

[<StructuralComparisonAttribute; StructuralEqualityAttribute>] 
type A<'T when 'T : comparison> = 
  | A of 'T list

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X