Existe-t-il un sucre syntaxique "de notation" pour la composition de fonction simple?Fonction Composition Do Notation
(c.-à-(.) :: (b -> c) -> (a -> b) -> a -> c
)
Je voudrais être en mesure de stocker les résultats de certaines compositions pour plus tard (tout en continuant la chaîne.
Je préfère ne pas utiliser l'extension RebindableSyntax si possible.
Je cherche quelque chose comme ceci:
composed :: [String] -> [String]
composed = do
fmap (++ "!!!")
maxLength <- maximum . fmap length
filter ((== maxLength) . length)
composed ["alice", "bob", "david"]
-- outputs: ["alice!!!", "david!!!"]
Je ne suis pas sûr que quelque chose comme cela est possible, étant donné que les res ul de la fonction précédente doit essentiellement passer "à travers" la liaison de maxLength, mais je suis ouvert à l'audition de toute autre option similaire expressive. Fondamentalement, j'ai besoin de recueillir des informations que je passe par la composition afin de l'utiliser plus tard.
Peut-être que je pourrais faire quelque chose comme ça avec une monade d'état?
Merci pour votre aide!
Modifier
Ce genre de chose fonctionne un peu:
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)))
S'il vous plaît préciser ce que la composition que vous essayez réellement d'obtenir ici. À tout le moins, donnez la signature de type que vous voulez pour 'composé '! – leftaroundabout
Juste la composition de la fonction normale, mais avec la possibilité de stocker des résultats interstitiels à utiliser dans les appels de fonction ultérieurs (voir l'exemple). J'ai ajouté le type. –
Y a-t-il une raison pour laquelle vous devez l'écrire en style sans point? Cela devrait être facile dans un style non-point-free. – immibis