2015-12-19 3 views

Antwort

5

Ich gehe davon aus, dass gemeint war

type Corner = Corner of int*int 

In diesem Fall ist, wird dies den ersten Wert erhalten:

let (Corner(first,_)) = corner 
+0

danke, ich meinte Typ für den Typ, ja :) Allerdings bedeutet diese Zuweisung, dass ich eine temporäre Variable benötigen, um das Mitglied des Tupels zu verwenden (zuerst erstellen, dann verweisen) –

6

Die Antwort von @Foole vorgesehen ist gut, aber aus dem Kommentar, den ich Sie haben den Eindruck, dass Sie die temporäre Variable first nicht gerne deklarieren möchten. Dies kann sich in der Tat schwerfällig anfühlen, wenn Sie nur den ersten Wert herausziehen und dann zu einer anderen Funktion leiten möchten.

Es gibt keinen Einbau-Anlage, die ich bin mir dessen bewusst, dass können Sie diese automatisch. Bedenken Sie, dass der oben angegebene Typ Corner ein degenerierter Fall einer diskriminierten Union (DU) ist. Normalerweise haben DUs mehr Fälle, und sie sind oft in ihrer Form heterogen.

Es kann gute Gründe geben, einen Single-Case-DU wie Corner zu haben, aber dann macht es oft Sinn, auch verschiedene "Helfer" -Funktionen zu verwenden, um das Arbeiten mit diesem Typ zu erleichtern.

Im Falle des Corner Typ, können Sie Funktionen definieren, wie:

let cornerX (Corner(x, _)) = x 

let cornerY (Corner(_, y)) = y 

Hier, ich habe angenommen, dass Corner Modelle eine Koordinate, aber wenn Sie möchten, können Sie auch den Namen Funktionen und snd. Sie können sie auch in ein eigenes Modul einfügen, wenn Sie das lieber bevorzugen.

Dies ermöglicht es Ihnen, ohne den Aufwand einer temporären Variablen einen Wert aus einem Corner Wert zu extrahieren und Rohr:

> corner |> cornerX |> ((*) 10) |> string;; 
val it : string = "10" 

wo corner wie im OP definiert ist.

+0

Ist es möglich zu bekommen eine generische Version für jede 2-tuple/n-tuple single case diskriminierte Verbindung? – mbx

+1

@mbx Ich denke nicht, denn was eigentlich los ist ist Mustererkennung auf einem Fall Konstruktor. Bei der Mustererkennung ist der Name des Fallkonstruktors wichtig: Es handelt sich tatsächlich um eine Funktion. In der Antwort von @TheQuickBrownFox finden Sie jedoch eine kurze Inline-Alternative, bei der Sie keine 'let'-gebundene Funktion deklarieren müssen. –

3

Wie bereits erwähnt, ist es die erste diskriminiert Union Fall zu bekommen, ohne die Benennung es nicht möglich ist. Aber hier ist ziemlich prägnante Art und Weise, es zu tun:

Corner (1,1) |> function Corner (x,_) -> x 

Dies verwendet das function Schlüsselwort, das eine Funktion mit einem Parameter erzeugt und springt direkt in eine Mustererkennung auf diesem Parameter. Da es nur einen passenden Fall gibt, passt es genau in eine Zeile.

Verwandte Themen