Можно ли манипулировать вложенными функциональными композициями в Haskell таким образом, чтобы некоторая обработка выполнялась перед каждой функцией перед композицией?Haskell Вложенные функции компостирования
Предположим, что вложенная композиция, например, (lines . unlines . words) "Testing Haskell composition"
(это не имеет смысла, это просто случайный пример). Я хотел бы сделать что-то перед выполнением lines
, unlines
и words
. Что-то вроде этого поддельного кода:
performComposition :: [functions] -> returnValue
performComposition [] =()
performComposition (f:fs) = do something
f (performComposition fs)
Возможно ли, даже если необходимо создать новый оператор?
EDIT (17 февраля 2016)
я не упомянул, что я хотел сделать что-то другое на последней функции. В приведенном выше примере функция words
сделает что-то отличное от других, прежде чем выполнять ее.
Решение, которое я нашел, подробно описано ниже.
вы можете написать свой собственный * композиция * оператор - но 'делать something' часть пахнет ... – Carsten
побочных эффектов Вы можете быть немного более конкретный в вашем примере? Для чего вы хотите использовать это? Какую проблему вы пытаетесь решить, которую нельзя решить, просто используя что-то вроде 'run before computation after = before >> return computation >> = (\ val -> after >> return val)'? Это монадическая функция, поэтому она не может использоваться вместо «вычисления». – bheklilr
Wait: вы хотите это: 'performComposition [] = id; executeComposition (f: fs) = f. Выполнить функцию fs'? Но это просто обобщает композицию на список функций (это 'fold'). – Bakuriu