从System.ZMQ4.Monadic查看runZMQ
:
此类型签名的含义是什么?
λ: :t runZMQ
runZMQ
:: transformers-0.4.2.0:Control.Monad.IO.Class.MonadIO m =>
(forall z. ZMQ z a) -> m a
特别是,我不理解forall
。
答案 0 :(得分:3)
来自ZQM docs:
ZMQ monad在ST之后建模并封装了Context。它使用未实例化的类型变量z来区分runZMQ的不同调用,并防止在其范围之外无意中使用套接字。参看John Launchbury和Simon Peyton Jones Lazy Functional State Threads的论文。
因此,z
参数的行为与s
中的ST s a
参数相同。
来自Haskell Wiki的ST monad的一个解释:
答案 1 :(得分:1)
ErikR的答案很好,为什么有forall
,但what
是另一回事。
要采取更简单的答案,请选择
类型f :: (a -> a) -> a
可以在具有相同输入和输出类型的任何函数上调用此函数。例如,f (*2) :: Int
是一个很好的术语。
另一方面
f :: (forall a. a -> a) -> Int
要求输入函数在a
中是多态的。换句话说,它要求输入函数适用于任何类型。基本上这意味着它只能是id
或返回错误的东西,因为否则它不能创建任意类型的值。
系统使用此限制行为来强制执行某些不变量,例如ST
ErikR提及使用它来确保无法从外部访问内部状态。