2017-02-10 5 views
3

Beim Versuch, mehr Anfragen in F # über LinqPad zu schreiben, stieß ich auf eine interessante Sache mit der WHERE-Klausel.Warum sind in F # Klammern erforderlich, wenn die Ausdruckswordklausel der Methode gekettet wird?

let dc = new TypedDataContext() 

let q = query { 
    for o in dc.OrderItem do 
    where (o.Description.Contains("spam")) 
    select o 
} 

q |> Dump 

Wenn ich die Klammer um o.Description.Contains("spam") entfernen erhalte ich die oft unten gesehen Fehlermeldung.

Aufeinander folgende Argumente durch Leerzeichen oder fach vervielfachen getrennt werden sollen, und Argumente Funktion oder Methode Anwendungen, bei denen sollen (mit externer F # -Compiler)

Wenn ich diesen Fehler sehe ich normalerweise klammerten werden erkennen, dass ich bin Ich gebe nicht genug Informationen, damit der Compiler versteht, dass ich versuche, das Ergebnis eines früheren Methodenaufrufs oder einer Eigenschaft abzurufen oder einen Zugriff auf den Aufruf auszuführen, aber in diesem Fall ist es mir unklar. Außerdem wäre ich neugierig, ob es eine idiomatischere Art gibt, die Bedingungen des Compilers zu erfüllen, ohne um den Ausdruck herumkommen zu müssen, um sowohl offene als auch schließende Klammern hinzuzufügen.

Antwort

7

Sie würden das gleiche Ergebnis sehen, wenn Sie so etwas wie dies tun:

let f x = 1 

f o.Description.Contains("spam") 

Wie die Meldung schon sagt, wenn Sie das Ergebnis eines Methodenaufruf verwenden (Contains in diesem Fall) als Argument Zu einer Funktion muss der Methodenaufruf geklammert werden. Auch wenn where ein Abfrageoperator und keine echte Funktion ist, gilt das gleiche Ergebnis.

Verwandte Themen