Я хочу последовательно скомпоновать два монадных действия в Haskell, отбросив любое значение, созданное вторым, и передав аргумент обоим действиям. В настоящее время я использую такой do-блок:
ask = do
result <- getLine
putStrLn result
return result
Я надеялся написать это немного более понятным и понятным, поэтому я попробовал это:
ask' = getLine <* putStrLn
Однако это даже не проверка типа, и проблема в том, что _ 3_ не передает результат первого действия второму. Я хочу связать действия вроде _ 4_ выполняет, но не меняет результат. Тип должен быть (a -> m b) -> (a -> m c) -> (a -> m b)
, но Hoogle не дает подходящих результатов. Каким будет оператор для достижения такой композиции функций?
getLine >>= \x -> putStrLn x >> return x
в безточечном стиле. Вы просили ламбдабота? Там написаноliftM2 (>>) putStrLn return =<< getLine
. - person Thomas M. DuBuisson   schedule 08.12.2015flip (liftM2 (>>)) :: Monad m => (a -> m b) -> (a -> m c) -> (a -> m b)
- фактический тип немного более обобщен, поэтому его трудно увидеть. - person user2407038   schedule 08.12.2015pointfree
инструмент командной строки, и он не смог обработатьdo
, поэтому я сдался. В итоге я использовалask = getLine >>= liftM2 (>>) putStrLn return
, что выглядит нормально, еще раз спасибо! Вы можете сформулировать это как ответ, если хотите, тогда я могу отметить его как решенное. - person amoebe   schedule 08.12.2015