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]
Возможно ли, что первая формулировка достаточна для практического использования?