Clojure имеет макрос ->
, который берет кусок данных и кучу функций, применяет данные к первой функции, а затем применяет результат этого к следующему, результат этого к третьему и т.д., наконец, давая вам результат последнего применения.
Мне это очень нравится, потому что вместо того, чтобы писать функции назад из того порядка, в котором они применяются, вот так: (псевдокод следует)
floor (square.root (x))
вы можете записать их в том порядке, в котором данные проходят через них:
-> x (square.root, floor)
Мой вопрос в том, есть ли стандартное имя для этой функции в функциональных языках, так как у карт, сокращений и фильтрации есть стандартные имена? В документах Clojure описывается это как "потоковая передача данных через функции", но я не мог найти что-либо в googling слово thread
. Я написал простую версию в Haskell:
thread :: a -> [(a -> a)] -> a
thread x [] = x
thread x (f:fs) = thread (f x) fs
и искал a -> [(a -> a)] -> a
в Hoogle, но ничего не придумал.
Во время исследования этого вопроса я также понял, что вы можете сделать очень похожее действие с помощью операторов композиции функций из Control.Arrow
в Haskell, например:
($2) (sin >>> cos >>> tan)
тогда как используя выделенную функцию thread
более высокого порядка, вы должны написать:
thread 2 [sin, cos, tan]
Возможно ли, что первая формулировка достаточно для практического использования?