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
是typeclassMonadM 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是的,谢谢。请不要犹豫,在以后的编辑中直接发表这样的评论。