У Clojure есть макрос, ->
, который берет часть данных и набор функций, применяет данные к первой функции, а затем применяет результат этого к следующей, результат что третьему и т. д., наконец, возвращая вам результат последнего приложения.
Мне это очень нравится, потому что вместо того, чтобы писать функции в обратном порядке, в порядке их применениявот так: (псевдокод следует)
floor (square.root (x))
вы можете записать их в том порядке, в котором данные проходят через них:
-> x (square.root, floor)
У меня вопрос, есть ли стандарт?имя для этой функции в функциональных языках, в том смысле, что карты, сокращения и фильтры имеют стандартные имена?Документы Clojure описывают это как «потоковую передачу данных через функции», но я не смог найти ничего по поиску слова «1012 *».Я написал простую версию в 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]
Возможно ли, что первой формулировки достаточно для практического использования?