ich eine curried Funktion haben, die Ich mag würde es verschiedene Arten von Parametern zu unterstützen, die nicht auf einer Vererbungsbeziehung sind:F # Mustervergleich auf Arten von Tupeln
type MyType1 = A | B of float
type MyType2 = C | D of int
Was ich versucht zu tun ist:
let func x y =
match (x, y) with
| :? Tuple<MyType1, MyType1> -> "1, 1"
| _ -> "..."
Dies ist jedoch nicht möglich. F # beschwert sich:
Der Typ '' a * 'b' hat keine geeigneten Subtypen und kann nicht als Quelle für einen Typprüfung oder eine Laufzeitnotation verwendet werden.
Was ist eine elegante Möglichkeit, dies zu tun?
EDIT: Lassen Sie mich versuchen, dies zu klären.
Ich habe zwei ähnliche, aber unterschiedliche Typen. Ich kann sehr einfach einen Typ in einen anderen konvertieren. Ich möchte eine binäre Operation definieren, die auf Entitäten dieser Typen wirkt, aber ich möchte dem Client eine einzelne Operation offen legen.
Das heißt, anstelle der Bereitstellung:
let op11 (x : MyType1) (y : MyType1) = // do something useful
let op12 (x : MyType1) (y : MyType2) =
// convert y to MyType1
let y' = // ...
// dispatch to op11
op11 x y'
let op21 (x : MyType2) (y : MyType1) = // similar
let op22 (x : MyType2) (y : MyType2) = // similar
was würde Ich mag es, eine einzige Funktion zu Client-Code zu entlarven:
let op (x : obj) (y : obj) = // ...
Das ist wie das Verhalten der Methode Überlastung zu simulieren, aber mit Curry-Funktionen.
Typprüfung in F #? Da stimmt etwas nicht. Was * genau * versuchst du zu tun? – Juliet
Ich verstehe nicht, was Sie fragen - was ist die Signatur von 'Func' (was sind die Arten von 'x' und 'y')? – Brian