出于某种原因,我无法在任何地方找到答案。我试过谷歌搜索“Haskell等号箭头”,我没有得到任何结果。假设我们有以下功能:
sendMessage :: MonadM e m => Message -> m ()
sendMessage message = do
mClient <- getMessageClient
liftIO $ send mClient message
e和m到底在哪里使用?它们是否被传递到Message对象(函数?),然后作为单一类型输出,m()?
我不认为我对Haskell很新有什么帮助,但是在这里我们会感激任何帮助。
答案 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 ....
你现在不必担心这件事。编写这样的类是一个有点高级的主题。但它表示某些操作可用于e
和m
类型,其中类型e
由类型m
确定。