return
- это функция типа Monad m => a -> m a
, поэтому, когда вы передаете значение типа (SmartMail, CompteSmail)
, вы получаете значение типа m (SmartMail, CompteSmail)
для некоторой монады m
(например, IO (SmartMail, CompteSmail)
или Maybe (SmartMail, CompteSmail)
). Поскольку это не то, что вы хотите здесь, вы не должны использовать return
.
do
нотация не связана с этим. do
- это просто синтаксический ярлык вокруг операторов >>
и >>=
. Когда вы используете do
с одним выражением, оно вообще ничего не делает. Другими словами, envoyerMessage' ssm csm tr = do return (ssm, csm)
точно такой же, как и envoyerMessage' ssm csm tr = return (ssm, csm)
.