Есть ли имя для функции, которая принимает фрагмент данных и список функций и применяет каждую функцию к результату последней?

Clojure имеет макрос, -> , который принимает часть данных и набор функций, применяет данные к первой функции, а затем применяет результат этого к следующей, результат , что к третьей, и так далее, наконец возвращая вам результат последнего приложения.

Мне это очень нравится, потому что вместо того, чтобы писать функции в обратном порядке, в порядке, в котором они применяются, например: (следует псевдокод)

floor (square.root (x))

, вы можете записывать их в том порядке, в котором данные проходят через них:

-> x (square.root, floor)

Мой вопрос: существует ли стандартное имя для этой функции в функциональных языках, например, отображение, сокращение и фильтр имеют стандартные имена? В документации Clojure это описывается как «передача данных через функции», но я не смог найти ничего при поиске слова thread . Я написал простую его версию на Haskell:

thread :: a -> [(a -> a)] -> a
thread x []     = x
thread x (f:fs) = thread (f x) fs

и искал a -> [(a -> a)] -> a в Hoogle, но это тоже ничего не дало.

Исследуя этот вопрос, я также понял, что вы можете сделать очень похожую вещь, используя операторы композиции функций из Control.Стрелка в Haskell, например:

($2) (sin >>> cos >>> tan)

, тогда как при использовании выделенной функции высшего порядка thread вы должны написать:

thread 2 [sin, cos, tan]

Возможно ли, что первая формулировка достаточна для практического использования?

13
задан Thomas 3 March 2012 в 15:01
поделиться