F # übergibt einen Operator mit Argumenten an eine Funktion

8

Können Sie eine Operation wie "dividiere durch 2" oder "subtrahiere 1" mit nur einem partiell angewendeten Operator übergeben, wobei "add 1" so aussieht:

%Vor%

Was passiert, ist, dass 1 als erstes Argument auf (+) angewendet wird und das Listenelement als zweites Argument angewendet wird. Für Addition und Multiplikation spielt diese Reihenfolge der Argumente keine Rolle.

Angenommen, ich möchte 1 von jedem Element subtrahieren (dies wird wahrscheinlich ein häufiger Anfängerfehler sein):

%Vor%

1 wird auf das (-) als erstes Argument angewendet, also bekomme ich anstelle von (list_item - 1) (1 - list_item) . Ich kann es so umschreiben, dass es ein negatives addiert, anstatt eines positiven zu subtrahieren:

%Vor%

Ich suche nach einer aussagekräftigeren Art, es zu schreiben, etwa wie ((-) _ 1) , wobei _ einen Platzhalter wie in der Arc-Sprache bezeichnet. Dies würde dazu führen, dass 1 das zweite Argument für - ist, also würde es in List.map auf list_item - 1 ausgewertet werden. Wenn Sie also divide by 2 der Liste zuordnen möchten, könnten Sie schreiben:

%Vor%

Kann das gemacht werden oder muss ich (fun x -> x/2) benutzen? Es scheint, dass wir der Platzhaltersyntax am nächsten kommen, wenn wir ein Lambda mit einem benannten Argument verwenden.

    
dan 30.11.2009, 02:57
quelle

3 Antworten

11

Sie könnten eine Flip-Funktion schreiben, etwa:

%Vor%

Ich könnte die Syntax falsch haben, ich bin nicht sonderlich fließend in F #.

    
Logan Capaldo 30.11.2009, 03:02
quelle
8

In F #, a la Haskell, gibt es keine 'operation sections' und auch keine Platzhalterargumente (anscheinend ein Arc). Sie können einen 'Flip'-Kombinator verwenden, wie in einer anderen Antwort vorgeschlagen, um die Reihenfolge der Argumente umzukehren und dann das erste (jetzt zweite) Argument teilweise anzuwenden.

Aber ich würde einfach

verwenden %Vor%

Wenn Sie nicht Code-Golf spielen, glaube ich nicht, dass Sie noch etwas kaufen können, wenn Sie versuchen, ein paar andere Charaktere zu rasieren.

    
Brian 30.11.2009 03:09
quelle
8

Die von von Logan Capaldo vorgeschlagene flip -Lösung kann auch mit einem Operator (hier% co_de) geschrieben werden %):

%Vor%

Oder wenn Sie die Operanden andersherum bevorzugen:

%Vor%

Bearbeiten: Wenn Sie einen Operator verwenden, der "eher wie ein Platzhalter aussieht" (hier >. ), kommen Sie Ihrer vorgeschlagenen Syntax sehr nahe:

%Vor%

'_' ist leider (?) nicht ein gültiges Operator-Symbol in F # .

    
Johan Kullbom 30.11.2009 08:53
quelle