=>是什么在哈斯克尔的标志意味着什么?

时间:2016-08-22 16:33:30

标签: haskell operators

出于某种原因,我无法在任何地方找到答案。我试过谷歌搜索“Haskell等号箭头”,我没有得到任何结果。假设我们有以下功能:

sendMessage :: MonadM e m => Message -> m ()
sendMessage message = do
    mClient  <- getMessageClient
    liftIO $ send mClient message

e和m到底在哪里使用?它们是否被传递到Message对象(函数?),然后作为单一类型输出,m()?

我不认为我对Haskell很新有什么帮助,但是在这里我们会感激任何帮助。

2 个答案:

答案 0 :(得分:5)

首先关闭:如果你想知道这样的操作员做了什么,不要问StackOverflow,问Hayoo

但实际上Hayoo对=>没有用处,因为与Haskell中几乎所有其他内容不同,这是内置语法而不是某些库中定义的运算符。

您的签名

sendMessage :: MonadM e m => Message -> m ()

表示以下内容:sendMessage的类型为Message -> m (),其中m可以是具有MonadM类型类实例的任何monad。

这可能对你没什么帮助,因为实际上MonadM是一个相当复杂的类型类。更好地考虑一个更简单的例子:

sum :: Num n => [n] -> n

这意味着:sum的类型是[n] -> n,其中n可以是任何数字类型,它是Num类的一个实例,即支持减法,乘法的类型,显然添加等。实际上语法是

的简写
sum :: ∀ n . Num n => [n] -> n

表示符合n约束的所有类型Num n,函数sum具有签名[n] -> n

您可以使用任何具体的数字类型实例化这样的多态函数:例如

sum :: [Int] -> Int

在您的示例中,您可能会将其实例化为

sendMessage :: Message -> MessageT IO ()

答案 1 :(得分:3)

类型签名

sendMessage :: MonadM e m => Message -> m ()

可以阅读

  

假设约束MonadM e m成立,sendMessage的类型为Message -> m ()

MonadM(几乎可以肯定)是一个具有功能依赖性的多参数类型类。它的定义可能看起来模糊不清

class Monad m => MonadM e m | m -> e where ....

你现在不必担心这件事。编写这样的类是一个有点高级的主题。但它表示某些操作可用于em类型,其中类型e由类型m确定。