Я хочу последовательно составлять два действия монады в Haskell, отбрасывая любое значение, созданное вторым, и передавая аргумент обоим действиям. В настоящее время я использую Do-блок, как это:Добавить действие без изменения результата в рефакторинг do-notation
ask = do
result <- getLine
putStrLn result
return result
Я надеялся написать эту немного больше безточечный и аккуратно, поэтому я попытался это:
ask' = getLine <* putStrLn
Однако это Безразлично» t даже проверить тип, и проблема в том, что <*
не передает результат первого действия ко второму. Я хочу связать действия, например, >>=
, но не изменить результат. Тип должен быть (a -> m b) -> (a -> m c) -> (a -> m b)
, но Hoogle не дает подходящих результатов. Что было бы оператором для достижения этой функции?
Так что вы хотите 'GetLine >> = \ х -> putStrLn х >> вернуться x' в безточечном. Вы спрашивали lambdabot? Он говорит 'liftM2 (>>) putStrLn return = << getLine'. –
@ ThomasM.DuBuisson Кажется, что Lambdabot нашел почти ту точную функцию, которую хотел OP! 'flip (liftM2 (>>)) :: Monad m => (a -> mb) -> (a -> mc) -> (a -> mb)' - фактический тип немного более обобщен, поэтому он несколько трудно видеть. – user2407038
@ ThomasM.DuBuisson Спасибо, я попросил инструмент командной строки 'pointfree', и он не мог обработать' do', поэтому я сдался. Я закончил использовать 'ask = getLine >> = liftM2 (>>) putStrLn return', который выглядит хорошо, спасибо снова! Вы можете поместить это в ответ, если хотите, тогда я могу отметить его как решение. – amoebe