Haskell 什么是=>;在哈斯克尔是什么意思?

Haskell 什么是=>;在哈斯克尔是什么意思?,haskell,operators,Haskell,Operators,由于某种原因,我在任何地方都找不到这个问题的答案。我试着用谷歌搜索“哈斯克尔等号箭头”,但没有得到任何结果。假设我们有以下功能: sendMessage :: MonadM e m => Message -> m () sendMessage message = do mClient <- getMessageClient liftIO $ send mClient message sendMessage::MonadM e m=>Message->m()

由于某种原因,我在任何地方都找不到这个问题的答案。我试着用谷歌搜索“哈斯克尔等号箭头”,但没有得到任何结果。假设我们有以下功能:

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

sendMessage :: MonadM e m => Message -> m ()
sendMessage :: MonadM e m => Message -> m ()
可以阅读

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

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

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

你现在不必担心这个。编写这样的类是一个比较高级的话题。但是它表示,一些操作与类型
e
m
相关,其中类型
e
由类型
m

决定。首先:如果您想知道某个或某个操作符做什么,不要问堆栈溢出,问

但事实上,Hayoo对
=>
没有任何用处,特别是因为,与Haskell中的几乎所有内容不同,它是内置语法,而不是在某些库中定义的运算符

你的签名

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

这可能对您帮助不大,因为事实上,
MonadM
是一个相当复杂的类型类。最好考虑一个简单的例子:

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

sum :: ∀ n . Num n => [n] -> n
这意味着对于满足约束的所有类型
n
,函数
sum
具有签名
[n]->n

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

sum :: [Int] -> Int
在您的示例中,您可能会将其实例化为

sendMessage :: Message -> MessageT IO ()

这是类型上下文:@LeeDuhem你能简单地解释一下这意味着什么吗?作为一个不使用Haskell编程的人,我很难理解您发送的链接。这一定是一个副本,但我不知道如何找到一个旧的副本。如果您来自Java,类型类有点像接口。看起来您的问题已经得到了回答:-)那么e&m仍然是这个函数的输入吗?还是仅仅是信息?或者…两者都有?此函数的输入只是一条
消息
。只要
m
是typeclass
MonadM e m
@Niko的实例,输出就是您选择的任何
m
类型:如果您愿意,它们是函数的类型级参数。但从这个角度看不一定有帮助。好吧,我想我明白了。我唯一的问题是,如果你不知道e是什么,你如何验证m是MonadM e m类型?还是我误解了“e”is@Niko,您不必在这里担心
e
,因为它似乎与
sendMessage
无关,尽管它可能对其他一些操作很重要
e
将由
m
具有的任何实例固定。您必须检查文档或GHC,看看您的特定
m
是否有实例。还要注意,
m
是一个类型,没有类型
MonadM
,而是满足约束
MonadM e m
;我会用很多的。因此,如果我理解正确,在=>符号之前的任何内容都只是对匹配的输入/输出元素的类型限制?基本上是的。事实上,首先忽略约束是有用的,或者考虑一个示例实例化或无约束多态函数来确定发生了什么。谢谢你的帮助。而不是,因为后者自2012年以来没有上传,而且上面的链接也无法访问。@RolandPuntaier是的,谢谢。请不要犹豫,在以后的编辑中直接发表这样的评论。