Использование выражений `do..return` в Haskell - PullRequest
0 голосов
/ 06 ноября 2018

Для этой функции:

envoyerMessage' :: SmartMail -> CompteSmail -> Trame -> (SmartMail, CompteSmail)

Ради тестирования я пытаюсь просто вернуть переданный элемент без каких-либо изменений.

Моя проблема заключается в следующем:

envoyerMessage' ssm csm tr = (ssm, csm) 

работает как задумано, но с do..return:

envoyerMessage' ssm csm tr = do
                             return (ssm, csm)

Я получаю это сообщение об ошибке: ошибка невозможности сопоставить фактический и ожидаемый тип

Почему return не возвращает ожидаемый тип?

edit: Я часто вижу, что return ассоциируется с IO type в описании функции, это связано с этой проблемой? Будет ли значение, полученное из return, всегда иметь значение IO type?

1 Ответ

0 голосов
/ 06 ноября 2018

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).

...