Ich habe selten diesen Kampf heute mit F #, aber dann wieder Typ Vererbung ist viel seltener mit F #, also vielleicht hatte ich nur Glück. Oder ich vermisse das Offensichtliche. Normalerweise, wenn der Compiler sich darüber beschwert, dass ich einen bestimmten Typ nicht kenne, vertausche ich die Reihenfolge der Pipes oder Compositionsoperanden und ich bin fertig.Typ Rückschluss mit Rohrleitungen oder Zusammensetzung fehlschlägt, wo normale Funktionsaufruf erfolgreich ist
Grundsätzlich funktioniert ein Funktionsaufruf, der als g(f x)
funktioniert, auch als x |> f |> g
oder (f >> g) x
. Aber heute ist es nicht ...
Hier ist ein unordentlicher Proof-of-concept von dem, was ich meine:
module Exc =
open System
type MyExc(t) = inherit Exception(t)
let createExc t = new MyExc(t)
type Ex = Ex of exn
type Res = Success of string | Fail of Ex with
static member createRes1 t = Ex(createExc(t)) |> Fail // compiled
static member createRes2 t = t |> createExc |> Ex |> Fail // FS0001
static member createRes3 = createExc >> Ex >> Fail // FS0001
Normalerweise funktioniert die (zumindest in meiner Erfahrung). Die Zeilen mit "fail" throw:
Fehler FS0001: Typ stimmt nicht überein. Erwartet ein MyExc -> 'a aber ein exn gegeben -> Ex. Der Typ ‚MyExc‘ nicht mit dem Typ übereinstimmen ‚EXN‘
Keine große Sache, nicht schwer zu umgehen, aber ich zufällig haben eine Menge Code zu schreiben, wo Zusammensetzung ist das einfacher/Reiniger Ansatz und ich Ich möchte nicht eine Reihe von Utility-Funktionen schreiben, die ich überall einfügen muss.
Ich sah flexible Typen, wie ich denke, das ist ein Kontravarianz-Problem, aber ich sehe nicht, wie ich es hier anwenden kann. Irgendwelche Ideen, um diese Idiomatik zu behalten?
Hinweis, wenn ich neu anordnen, d. H. Als Ex <<createExc>> Fail
oder mit der Pipe-Rückwärts-Operator ich am Ende mit dem gleichen Fehler auf einem anderen Teil.
Ausgezeichnet und aufschlussreich, wie immer, danke Tomas. Scheint, als wären wir uns einig, dass dies sicherlich eine seltsame Art von Verhalten ist. Ich dachte immer (und normalerweise ist das richtig), dass sich DU-Konstruktoren wie Funktionen verhalten und ich sie ständig ketten/komponiere. Wenn sie die Unterschrift der DU-Mitglieder betrachten, sehen sie "ähnlich aus". – Abel