Почему Map.make.fold больше похож на List.fold_right (который не является хвостово-рекурсивным)? - PullRequest
2 голосов
/ 13 июля 2011

Вопрос наивный на фолде Окамла: не могли бы вы объяснить, почему Map.make.fold больше похож на List.fold_right вместо List.fold_left, отметив этот List. fold_right не является tail_recursive? Должны были быть Map.make.fold_left и Map.make.fold_right?

type of Map.make.fold 
val fold : (key -> 'a -> 'b -> 'b) -> 'a t -> 'b -> 'b

type of List.fold_left    
val fold_left : ('a -> 'b -> 'a) -> 'a -> 'b list -> 'a

type of List.fold_right
val fold_right : ('a -> 'b -> 'b) -> 'a list -> 'b -> 'b

Ответы [ 2 ]

4 голосов
/ 13 июля 2011

Если вы посмотрите документацию о том, что сгиб карты делает : (f kN dN ... (f k1 d1 a)...), вы увидите, что он фактически выполняет левое сгибание (где слева - наименьшая клавиша, а право - самый большой ключ).

Для карты или набора, который является бинарным деревом поиска, довольно легко обойти его в обоих направлениях, в отличие от (односвязного) списка, который можно просматривать только в одном направлении; поэтому одинаково легко делать хвост-рекурсивные сгибы в обоих направлениях.

Что касается порядка аргументов, я думаю, это просто дизайнерское решение. Сгибы списка Хаскелла (foldl и foldr), а также Карты Хаскелла fold последовательно имеют аргумент начального значения перед аргументом списка. Я думаю, что последовательность хорошая. Сгибы списка OCaml в разных направлениях имеют разные порядки аргументов (я думаю, это может быть потому, что для левого сгиба вы помещаете начальный аргумент слева, а прогрессивный «сгибаете» его вправо по списку, тогда как для правого сгиба вы кладете начальный элемент справа и постепенно сгибайте его слева над списком, поэтому размещение аргументов визуально согласуется с действием.) Очевидно, порядок аргументов сгиба в Map в OCaml такой же, как и у правого сгиба. Я не думаю, что это действительно имеет значение.

Что касается наличия двух сгибов карты, это может иметь определенную ценность. Карта Хаскелла представила оба направления фолдинга в GHC 6.12. Раньше была только правильная складка. Однако большинство случаев использования сгиба на карте, вероятно, не заботится о порядке.

1 голос
/ 13 июля 2011

Ваш вопрос подразумевает, что порядок аргументов в функции связан с тем, является ли она хвостовой рекурсивной, но это не так. List.fold_right может иметь такую ​​же подпись, как и List.fold_right, но это не изменит его реализацию.

...