Ich habe ein Problem damit, dass mein DU wie erwartet funktioniert. Ich habe ein neu MIR definiert, die entweder ein Ergebnis vom Typ hat < ‚a> oder jede Exception abgeleitet von System.ExceptionF # Discriminated Union Type Problem
open System
// New exceptions.
type MyException(msg : string) = inherit Exception(msg)
type MyOtherException(msg : string) = inherit MyException(msg)
// DU to store result or an exception.
type TryResult<'a, 't> =
| Result of 'a
| Error of 't :> Exception
//This is fine.
let result = Result "Test"
// This works, doing it in 2 steps
let ex = new MyOtherException("Some Error")
let result2 = Error ex
// This doesn't work. Gives "Value Restriction" error.
let result3 = Error (new MyOtherException("Some Error"))
Ich kann nicht verstehen, warum es mir erlaubt, einen‚Fehler‘zu erstellen, wenn Ich mache es in 2 Schritten, aber wenn ich dasselbe in einer einzigen Zeile mache, erhalte ich einen Werteinschränkungsfehler.
Was fehlt mir?
Dank
UPDATE
von @kvb bei der Post Sehen, Hinzufügen von Informationen Typ jedes Mal, ich brauche ein bisschen ausführlicher, um einen Fehler zu schaffen schien so wickelte ich es in ein zusätzliches Verfahren auf die erstellt einen Fehler und ist ein wenig prägnanter.
// New function to return a Result
let asResult res : TryResult<_,Exception> = Result res
// New function to return an Error
let asError (err : Exception) : TryResult<unit,_> = Error(err)
// This works (as before)
let myResult = Result 100
// This also is fine..
let myResult2 = asResult 100
// Using 'asError' now works and doesn't require any explicit type information here.
let myError = asError (new MyException("Some Error"))
Ich bin nicht sicher, ob ein Fehler mit ‚Einheit‘, wenn die Angabe keine Folgen haben werde ich noch nicht vorhersehbar.
TryResult<unit,_> = Error(err)
Danke. Das macht Sinn. Ich habe meine Frage aktualisiert, indem ich eine zusätzliche Error-Erstellungsmethode hinzugefügt habe, die gut zu funktionieren scheint und sie etwas aufgeräumter hält. Die einzige Frage ist, dass der Typ jetzt als TryResult angegeben ist. Nicht sicher, ob dies eine Downside haben wird. –
Moog