Есть ли синтаксический сахар "do notation" для простой композиции функций?
(i.e. (.) :: (b -> c) -> (a -> b) -> a -> c
)
Я хотел бы иметь возможность сохранять результаты некоторых композиций на потом (при этом продолжая цепочку.
Я бы предпочел не использовать расширение RebindableSyntax, если это возможно.
Я ищу что-то вроде этого:
composed :: [String] -> [String]
composed = do
fmap (++ "!!!")
maxLength <- maximum . fmap length
filter ((== maxLength) . length)
composed ["alice", "bob", "david"]
-- outputs: ["alice!!!", "david!!!"]
Я не уверен, что что-то подобное возможно, поскольку результат более ранней функции по существу должен пройти «сквозь» привязку maxLength, но я открыт для любых других подобных выразительных вариантов. В основном мне нужно собирать информацию, когда я просматриваю композицию, чтобы использовать ее позже.
Возможно, я мог бы сделать что-то подобное с монадой состояния?
Спасибо за вашу помощь!
Изменить
Такая штука вроде работает:
split :: (a -> b) -> (b -> a -> c) -> a -> c
split ab bac a = bac (ab a) a
composed :: [String] -> [String]
composed = do
fmap (++ "!!!")
split
(maximum . fmap length)
(\maxLength -> (filter ((== maxLength) . length)))
composed
! - person leftaroundabout   schedule 10.11.2016composed xs = filter ((== maxLength) . length) modified
where modified = fmap (++ "!!!") xs
maxLength = maximum $ fmap length modified
(с соответствующими пробелами) - person user253751   schedule 11.11.2016