Ich habe endlich einen exzellenten Einstiegspunkt in die funktionale Programmierung mit Ulme gefunden, und, Junge, mag ich es, aber mir fehlt noch eine gewisse grundsätzliche Eleganz in Bezug auf einige Konzepte.Map List auf shifted self
Ich finde oft, dass ich Code schreibe, der dem folgenden ähnlich ist, der zu tun scheint, was er sollte, aber wenn jemand Erfahrener einen kompakteren und direkteren Ansatz vorschlagen könnte, bin ich sicher, dass er wertvolle Einsichten in dieses Thema geben könnte so (U) Rarität.
Was ich mir vorstellen, diese kochen könnte nach unten, ist so etwas wie die folgenden (<->
ist ein Vektor Subtraktionsoperator):
edgeDirections : List Vector -> List Vector
edgeDirections corners = List.map2 (\p v -> p <-> v) corners (shiftr 1 corners)
aber ich habe nicht wirklich eine befriedigende Annäherung an ein Verfahren, das würde Tun Sie eine shiftr
.
Aber die Regeln von stackoverflow verlangen es, hier ist, was ich versucht habe. Ich schrieb ein hässliches Beispiel für eine mögliche Nutzung für shiftr
(Ich mag nicht unbedingt die Debug.crash
und ich bin nicht glücklich über die Maybe
):
In einer vorgegebenen Liste von Vektoren (die Eckpunkte eines Polygons), berechnen die Richtungsvektoren durch Berechnen der Differenz jedes Eckvektors zu seinem vorherigen, beginnend mit dem Unterschied zwischen dem ersten und dem letzten Eintrag in der Liste.
[v1,v2,v3] -> [v1-v3,v2-v1,v3-v2]
Hier geht:
edgeDir : Vector -> (Maybe Vector, List Vector) -> (Maybe Vector, List Vector)
edgeDir p (v, list) =
case v of
Nothing ->
Debug.crash ("nono")
Just vector ->
(Just p, list ++ [ p <-> vector ])
edgeDirections : List Vector -> List Vector
edgeDirections corners =
let
last =
List.head <| List.reverse corners
in
snd <| List.foldl edgeDir (last, []) corners
main =
show <| edgeDirections [ Vector -1 0, Vector 0 1, Vector 1 0 ]
Ich schätze jeden Einblick, wie dieses Ergebnis in einer direkteren Art und Weise erreicht werden könnte, vielleicht vorhandene Sprachkonstrukte mit mir jetzt noch nicht bewusst bin, oder jede Hinweise, wie man den Schmerz mit Maybe
lindern kann. Letzteres kann nicht möglich sein, aber ich bin mir sicher, dass die ehemalige a) mich wegblasen und b) mich meinen Kopf ein paar Mal kratzen lassen wird.
Vielen Dank und vielen Dank für diese gelungene Sprache!
Das ist genau das Muster, das ich vorher gesehen hatte und dachte, dass es hier anwendbar sein könnte. Danke für die Demonstration! Nur aus Neugier, impliziert '(x :: xs)', dass 'x' nicht' Nichts' ist? Edit: Streik, ich bin sicher, dass es nicht bedeutet, dass, deshalb ist das vorteilhaft, verstanden. – mindandmedia