Desidero comporre sequenzialmente due azioni monad in Haskell, scartando qualsiasi valore prodotto dal secondo e passando l'argomento ad entrambe le azioni. Attualmente sto usando un fai-block come questo:Aggiungere un'azione senza modificare il risultato alla do-notazione refactor
ask = do
result <- getLine
putStrLn result
return result
Speravo di scrivere questo punto un po 'più libero e pulito, così ho provato questo:
ask' = getLine <* putStrLn
Tuttavia, questo doesn' t anche digitare check e il problema è che <*
non trasferisce il risultato della prima azione al secondo. Voglio concatenare le azioni come fa >>=
, ma non modificare il risultato. Il tipo deve essere (a -> m b) -> (a -> m c) -> (a -> m b)
, ma Hoogle non produce risultati adeguati. Quale sarebbe un operatore per ottenere questa composizione di funzioni?
Così si vuole 'GetLine >> = \ x -> x putStrLn >> ritorno x' in stile libero punto. Hai chiesto lambdabot? Dice 'liftM2 (>>) putStrLn return = << getLine'. –
@ ThomasM.DuBuisson Sembra che Lambdabot abbia trovato quasi la funzione esatta che l'OP voleva! 'flip (liftM2 (>>)) :: Monad m => (a -> mb) -> (a -> mc) -> (a -> mb)' - il tipo attuale è leggermente più generalizzato quindi è un po ' difficile da vedere. – user2407038
@ ThomasM.DuBuisson Grazie, ho chiesto lo strumento da riga di comando 'pointfree', e non poteva gestire' do', quindi ho rinunciato. Ho finito per usare 'ask = getLine >> = liftM2 (>>) putStrLn return', che sembra ok, grazie ancora! Puoi metterlo in una risposta se vuoi, quindi posso contrassegnarlo come risolto. – amoebe