在Signature中理解`System.ZMQ4.Monadic`的'forall`

时间:2016-05-28 15:32:04

标签: haskell

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

2 个答案:

答案 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的一个解释:

https://wiki.haskell.org/Monad/ST

答案 1 :(得分:1)

ErikR的答案很好,为什么forall,但what是另一回事。

要采取更简单的答案,请选择

类型
f :: (a -> a) -> a

可以在具有相同输入和输出类型的任何函数上调用此函数。例如,f (*2) :: Int是一个很好的术语。

另一方面

f :: (forall a. a -> a) -> Int

要求输入函数在a中是多态的。换句话说,它要求输入函数适用于任何类型。基本上这意味着它只能是id或返回错误的东西,因为否则它不能创建任意类型的值。

系统使用此限制行为来强制执行某些不变量,例如ST ErikR提及使用它来确保无法从外部访问内部状态。