在Haskell中使用do..return表达式

时间:2018-11-06 03:47:03

标签: haskell return-value

为此功能:

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

为了进行测试,我尝试简单地返回通过的元素,而不进行任何更改。

我的问题是这样

envoyerMessage' ssm csm tr = (ssm, csm) 

可以正常工作,但可以使用do..return

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

我收到此错误消息: error about being unable to match actual and expected type

为什么return不返回预期的类型?

编辑:我经常在功能描述中看到returnIO type关联,这与这个问题有关吗?从return获得的值是否总是IO type

1 个答案:

答案 0 :(得分:3)

return是类型Monad m => a -> m a的函数,因此,当您传入类型(SmartMail, CompteSmail)的值时,对于某个单子{ {1}}(例如m (SmartMail, CompteSmail)m)。由于这不是您想要的,因此不应该使用IO (SmartMail, CompteSmail)

Maybe (SmartMail, CompteSmail)表示法与此无关。 return只是dodo运算符周围的句法捷径。当对单个表达式使用>>时,它什么也不做。换句话说,>>=do完全相同。