Ich habe kämpfen, um den Code in der RoP Artikel von Scott Wlaschin zu verstehen:Der Versuch, die Wahl Art in F # verstehen
http://fsharpforfunandprofit.com/posts/railway-oriented-programming-carbonated/
Er Verwendung der # Choice1Of2 & Choice2Of2 Typen in F macht. Ich habe versucht, sich mit zu kommen, wie diese Dinge zu nutzen, indem sie das Debuggen, wenn ich über das folgende Szenario kam:
module TestModule
open Microsoft.VisualStudio.TestTools.UnitTesting
// generic union type (like Choice1Of2, I think)
type Things<'a> =
| Thing of 'a
// explicit union type (for comparison)
type Numbers =
| Integer of int
[<TestClass>]
type Tests() =
// method to make a Choice1Of2 (from the article)
let makeChoice (a : string) : Choice<string, 'a> =
Choice1Of2 a
[<TestMethod>]
member public this.WhyYouNoHaveItemValueAndStuff() =
let choice1 = Thing "test" // debug = Thing "this"
let choice2 = Integer 3 // debug = Integer 3
let choice3 = makeChoice "test" // debug = Choice1Of2 w/Item = "test"
let choice4 = Choice1Of2 "test" // debug = [email protected] ???
// bogus test stuff below here
let choices = (choice1, choice2, choice3, choice4)
Assert.IsNotNull(choices)
Warum ist es, dass, wenn ich einen Choice1Of2 direkt (choice4) machen, weiß ich nicht Erhalte das gleiche Debugging-Ergebnis wie die Auswahl 3. Warum benutzt man eine Methode, um choice3 zu machen, um die gleiche Art von Ergebnis zu erhalten wie choice1 & 2?
EDIT:
Es scheint, dass choice4 zu diesem Wechsel:
let choice4 : Choice<string, Object> = Choice1Of2 "test"
klappt es. Es ist mir völlig unklar, warum ich das dort brauche. Die rechte Seite der Zuweisung ist so klar wie der Tag, um den Typ festzulegen.
Nicht sicher, was genau Typ-Inferenz dort tut, aber es ist wahrscheinlich durch den undefinierten Typ dieser Werte verwirrt. Der Laufzeittyp ist 'Choice' für beide, und sie scheinen in der Verwendung identisch zu sein. Mit einer Typannotation wie ': Choice ' auf 'choice3' und' choice4' sehen sie auch in den Debug-Informationen identisch aus. –
Vandroiy
@Vandroiy Thx für die Antwort. Das zwingt tatsächlich das richtige Verhalten. Immer noch seltsam, dass es notwendig ist. – TBone
Es scheint mir, dass es nicht wirklich um korrektes Verhalten geht, sondern darum, was Sie im Debugger beobachten.Ich nehme an, dass Sie sehen, dass choice4 einen unvollständig abgeleiteten Typ hat und dass die interne Darstellung eines unvollständig abgeleiteten Typs sich von der eines Typs mit einem generischen Parameter unterscheidet. Wenn Sie nicht einen Fall finden, in dem diese Bindungen im Code anders ausgewertet werden (anders als im Debugger), glaube ich nicht, dass dies mehr als ein VS-Implementierungsdetail ist. –