Ich möchte zwei Monaden-Aktionen in Haskell sequenziell verfassen, jeden Wert der Sekunde verwerfen und das Argument an beide Aktionen übergeben. Derzeit verwende ich einen do-Block wie folgt aus:Aktion hinzufügen, ohne das Ergebnis in refactor do-notation zu ändern.
ask = do
result <- getLine
putStrLn result
return result
Ich hatte gehofft, diese ein wenig mehr Punkt frei und ordentlich zu schreiben, so dass ich versucht, dieses:
ask' = getLine <* putStrLn
jedoch doesn diese‘ t sogar Typ prüfen und das Problem ist, dass <*
das Ergebnis der ersten Aktion nicht auf die zweite übertragen. Ich möchte die Aktionen wie >>=
ketten, aber das Ergebnis nicht ändern. Der Typ sollte (a -> m b) -> (a -> m c) -> (a -> m b)
sein, aber Hoogle ergibt keine geeigneten Ergebnisse. Was wäre ein Operator, um diese Funktionszusammensetzung zu erreichen?
So möchten Sie 'getLine auch >> = \ x -> putStrLn x >> Rückkehr x' im freien Stil Punkt. Hast du Lambdabot gefragt? Es heißt 'liftM2 (>>) putStrLn return = << getLine'. –
@ ThomasM.DuBuisson Es scheint, als ob Lambdabot fast die genaue Funktion gefunden hätte, die OP wollte! 'flip (liftM2 (>>)) :: Monad m => (a -> mb) -> (a -> mc) -> (a -> mb)' - der tatsächliche Typ ist etwas allgemeiner, so ist es etwas schwer zu sehen. – user2407038
@ ThomasM.DuBuisson Danke, ich fragte das 'pointfree' Befehlszeilen-Tool, und es konnte' do' nicht behandeln, also gab ich auf. Am Ende habe ich 'ask = getLine >> = liftM2 (>>) putStrLn return' verwendet, was gut aussieht, danke nochmal! Sie können dies in eine Antwort einfügen, wenn Sie wollen, dann kann ich es als gelöst markieren. – amoebe