为此功能:
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
不返回预期的类型?
编辑:我经常在功能描述中看到return
与IO type
关联,这与这个问题有关吗?从return
获得的值是否总是IO type
?
答案 0 :(得分:3)
return
是类型Monad m => a -> m a
的函数,因此,当您传入类型(SmartMail, CompteSmail)
的值时,对于某个单子{ {1}}(例如m (SmartMail, CompteSmail)
或m
)。由于这不是您想要的,因此不应该使用IO (SmartMail, CompteSmail)
。
Maybe (SmartMail, CompteSmail)
表示法与此无关。 return
只是do
和do
运算符周围的句法捷径。当对单个表达式使用>>
时,它什么也不做。换句话说,>>=
与do
完全相同。