2010-12-02 5 views
2

Скажем, у меня есть список значений, к которым я хочу, чтобы применить последовательность операций, пока я не получить окончательный результат:Как запустить последовательность операций (функций) в Haskell?

[0, 1, 2] 

firstOperation xs = map (+1) xs 
secondOperation xs = filter even xs 
thirdOperation xs = sum xs 

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

runAllOperations xs = thirdOperation (secondOperation (firstOperation xs)) 

, но это и некрасиво, и возникает проблема, что если у меня есть 10 операций, превращает этот бит кода в Maintanance кошмар ,

Каков правильный способ реализации чего-то подобного здесь? Имейте в виду, что приведенный выше пример - просто упрощение того, с чем я столкнулся в своем текущем проекте.

+0

Когда я смотрю на ваши фрагменты кода я вижу преобразования, которые вы хотите применить к входу. Где операции? Подсказка: я думаю, вы думаете о Haskell неправильно и, следовательно, задаете неправильный вопрос, не понимая этого. – 2010-12-02 22:28:49

+0

Я также считаю, что это так. К сожалению :( – 2010-12-03 08:54:43

ответ

3

Если вы можете составить список всех операций, вы можете сложить оператор композиции над этим списком:

foldr (.) id fns 

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

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

+0

Только если все операции имеют один и тот же тип (то есть `[a] -> [a]`, ничего подобного `[a] -> [b]`). – ephemient 2010-12-02 21:50:28

6

. или $ способ более читабельным, чем ( и )

runAllOperations xs = thirdOperation $ secondOperation $ firstOperation xs 

или

runAllOperations = thirdOperation . secondOperation . firstOperation 
Смежные вопросы