Ich denke keinen guten Grund, Array.get
und List.nth
auf diese Weise zu definieren. Da Pipelining in F # sehr häufig vorkommt, sollten sie so definiert sein, dass das Argument source
als letztes kommt.
Bei List.nth
, es ändert sich nicht viel, weil Sie Seq.nth
und Zeitkomplexität ist noch O(n)
verwenden können, wo n
Länge der Liste ist:
[1..100] |> Seq.nth 10
Es ist keine gute Idee Seq.nth
verwenden auf Arrays, weil Sie wahlfreien Zugriff verlieren. Damit O(1)
Zeit von Array.get
läuft, können Sie definieren:
[<RequireQualifiedAccess>]
module Array =
/// Get n-th element of an array in O(1) running time
let inline nth index source = Array.get source index
Im Allgemeinen können verschiedene Argument, um durch die Verwendung flip
Funktion gelindert werden:
let inline flip f x y = f y x
Sie können es verwenden, um direkt auf die oben genannten Funktionen:
[1..100] |> flip List.nth 10
[|1..100|] |> flip Array.get 10
Es macht den Trick, aber ich mag seine Lesbarkeit nicht - sehr klaustrophobisch! –
@PaulJurczak Absolut, es ist eher eine Frage des Stils. Persönlich liebe ich Operatoren, aber sie haben natürlich [Einschränkungen] (http://stackoverflow.com/a/12499093/974789) in F #, also ist es eine Wahl zwischen 'flip', Erweiterungsmethoden und' <| '. Es scheint, es gibt keine bessere Idee. – bytebuster
+1 'not' und' defaultArg' haben mich daran gewöhnt, '<|'; es scheint nicht so peinlich, wenn man sich erst einmal daran gewöhnt hat. – ildjarn