Есть ли синтаксический сахар «do notation» для простой функциональной композиции?Функция Композиция Обозначение
(т.е. (.) :: (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!!!"]
Я не уверен, что-то, как это возможно, так как рес ult более ранней функции по существу должен пройти «через» привязку 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)))
Пожалуйста, сформулируйте состав вы на самом деле пытаетесь получить здесь. По крайней мере, дайте подпись типа, которую вы хотите для 'compos'! – leftaroundabout
Просто нормальный состав функции, но с возможностью хранения результатов межстраничного доступа для использования в последующих вызовах функций (см. Пример). Я добавил тип. –
Есть ли причина, по которой вам нужно написать ее в стиле без очков? Это должно быть легко в стиле без точек. – immibis