2013-09-29 3 views
7

Es gibt mindestens zwei Dinge, die ich nicht verstehe:Warum unterscheidet sich die Signatur von FoldBack so sehr von F #?

  • Refactoring von der linken zur rechten Seite Faltung erfordert in Unterschrift eine Menge Veränderungen nicht nur, sondern an jedem Ort auf der Ordner-Funktion abhing
  • gibt es keine Möglichkeit zu Kette es in Bezug auf die Liste, ohne die Parameter zu Spiegeln

List.foldBack : ('T -> 'State -> 'State) -> 'T list -> 'State -> 'State

List.fold : ('State -> 'T -> 'State) -> 'State -> 'T list -> 'State

Gibt es einen guten Grund dafür, warum jemand alle Parameter in die Signatur von foldBack im Vergleich zu fold umgekehrt?

+0

Zu Ihrer Bearbeitung: Dies liest sich nur wie ein Ritt. Auch kann es nie geändert werden, ohne große Stücke Code zu brechen –

+1

Ich denke, die Signatur liest natürlich aus, sobald Sie das richtige mentale Modell haben, was jeder tut. Auch in einer faulen Sprache gibt es einen guten Grund, diese Leute zu trennen. Ich denke jedoch, dass es eine gültige Frage ist. – nicolas

Antwort

9

Es ist nur eine nützliche Erinnerung, um dem Programmierer zu helfen, sich daran zu erinnern, wie die Liste iteriert wird. Stellen Sie sich vor, Ihre Liste ist mit dem Anfang auf der linken Seite und dem Ende auf der rechten Seite angelegt. fold beginnt mit einem Anfangszustand auf der linken Seite und akkumuliert den Zustand nach rechts. foldBack macht das Gegenteil, es beginnt mit einem Anfangszustand auf der rechten Seite und geht zurück über die Liste nach links.

Dies zeigt auf jeden Fall das OCaml-Erbe von F #, da einige andere funktionale Sprachen (Haskell, Scala, ML) die Liste als letztes Argument für die gebräuchlicheren partiellen Anwendungsszenarien behalten.

Wenn ich wirklich eine Version von foldBack benötigt, die genau wie fold sah, würde ich meine eigene Hilfsfunktion definieren:

module List = 
    let foldBack' f acc lst = 
    let flip f a b = f b a 
    List.foldBack (flip f) lst acc 
+0

* behalte die Liste als letztes Argument, um die gebräuchlicheren partiellen Anwendungsszenarien zu ermöglichen * nun, genau das ist nicht der Fall, wenn es darum geht, foldBack in F # –

+1

Ja, das hat er gesagt. –

3

Es ist ein Relikt von F # 's Anfänge in OCaml. Sie können sehen, dass die F # -Funktionssignaturen für List.fold und List.foldBack in the OCaml documentation identisch sind (wo sie List.fold_left bzw. List.fold_right genannt werden).

Verwandte Themen