2013-09-29 17 views
7

Istnieją co najmniej 2 rzeczy, których nie rozumiem o nim:Dlaczego sygnatura foldBack różni się od fałdu w F #?

  • refaktoring od lewej strony do prawej bocznej składania wymaga dużo zmian nie tylko w podpisie, ale w każdym miejscu, zależy od funkcji folderu
  • nie ma sposobu, aby go łańcuchem w odniesieniu do wykazu bez odwracania parametrów

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

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

Jakiekolwiek powody, dla których ktoś wprowadziłby wszystkie parametry w odwrotnej kolejności pod sygnaturą foldBack w porównaniu do fold?

+0

Do edycji: to po prostu brzmi jak rant. Nie można go też nigdy zmienić bez zerwania ogromnych fragmentów kodu. –

+1

Myślę, że sygnatura czyta się naturalnie, gdy masz już prawidłowy model mentalny tego, co robi każdy. także w leniwym langage, jest bardzo dobry powód, aby trzymać tych gości oddzielnie. Myślę, że jest to jednak ważne pytanie. – nicolas

Odpowiedz

9

Jest to po prostu użyteczny mnemonik, aby pomóc programistowi zapamiętać, w jaki sposób lista jest iterowana. Wyobraź sobie, że twoja lista jest ułożona z początkiem po lewej i po prawej stronie. fold rozpoczyna się od stanu początkowego po lewej stronie i akumuluje stan w prawo. foldBack działa odwrotnie, zaczyna się od stanu początkowego po prawej stronie i wraca na listę po lewej stronie.

To zdecydowanie pokazuje dziedzictwo OCaml F #, ponieważ niektóre inne języki funkcyjne (Haskell, Scala, ML) utrzymują listę jako ostatni argument, aby umożliwić stosowanie bardziej typowych scenariuszy częściowego zastosowania.

Gdybym naprawdę potrzebne wersję foldBack który wyglądał dokładnie tak, jak fold, chciałbym zdefiniować własną funkcję pomocniczą:

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

* Zachowaj listę jako ostatni argument, aby pozwolić na bardziej typowe scenariusze częściowego zastosowania * dobrze, że dokładnie tak nie jest, jeśli chodzi o foldBack w F # –

+1

Tak, właśnie to powiedział. –

3

Jest to relikt z początków F # 's w SML. Widać, że sygnatury funkcji F # dla List.fold i List.foldBack są takie same w the OCaml documentation (gdzie nazywane są odpowiednio List.fold_left i List.fold_right).

Powiązane problemy