Как запустить последовательность операций (функций) в Haskell? - PullRequest
2 голосов
/ 03 декабря 2010

Допустим, у меня есть список значений, к которым я хочу применить последовательность операций, пока не получу окончательный результат:

[0, 1, 2]

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

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

runAllOperations xs = thirdOperation (secondOperation (firstOperation xs))

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

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

Ответы [ 2 ]

6 голосов
/ 03 декабря 2010

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

runAllOperations xs = thirdOperation $ secondOperation $ firstOperation xs

или

runAllOperations = thirdOperation . secondOperation . firstOperation
4 голосов
/ 03 декабря 2010

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

foldr (.) id fns

Затем вы можете применить результат этого к начальным значениям.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...