出于某种原因,我无法在任何地方找到答案.我试过谷歌搜索"Haskell等号箭头",我没有得到任何结果.假设我们有以下功能:
sendMessage :: MonadM e m => Message -> m ()
sendMessage message = do
mClient <- getMessageClient
liftIO $ send mClient message
Run Code Online (Sandbox Code Playgroud)
e和m到底在哪里使用?它们是否被传递到Message对象(函数?)然后作为单一类型输出,m()?
我不认为我对Haskell很新是有帮助的,但是这里有任何帮助.
首先:如果你想知道这样的操作员做了什么,不要问StackOverflow,问问Hayoo!
但实际上Hayoo并没有=>特别的用处,因为与Haskell中几乎所有其他内容不同,这是内置语法,而不是某些库中定义的运算符.
你的签名
sendMessage :: MonadM e m => Message -> m ()
Run Code Online (Sandbox Code Playgroud)
表示以下内容:sendMessageis 的类型Message -> m (),where m可以是具有MonadM类类实例的任何monad .
这可能对你没什么帮助,因为事实上它MonadM是一个相当复杂的类型.更好地考虑一个更简单的例子:
sum :: Num n => [n] -> n
Run Code Online (Sandbox Code Playgroud)
这意味着:sum的类型是[n] -> n,其中n可以是任何数字类型Num,即类的实例,即支持减法,乘法,显然加法等的类型.实际上语法是简写
sum :: ? n . Num n => [n] -> n
Run Code Online (Sandbox Code Playgroud)
意味着对于n满足约束的所有类型Num n,函数sum都具有签名[n] -> n.
您可以使用任何具体的数字类型来实例化这样的多态函数:例如
sum :: [Int] -> Int
Run Code Online (Sandbox Code Playgroud)
在你的例子中,你可能会将它实例化为类似的东西
sendMessage :: Message -> MessageT IO ()
Run Code Online (Sandbox Code Playgroud)