在Haskell中=>符号是什么意思?

Nik*_*iko 4 haskell operators

出于某种原因,我无法在任何地方找到答案.我试过谷歌搜索"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很新是有帮助的,但是这里有任何帮助.

lef*_*out 6

首先:如果你想知道这样的操作员做了什么,不要问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)