我已经阅读了 Existential Types Wikibook,它比较了使用forall
和使用小写字母来定义泛型类型。然后它说真正有用的forall
是当您将它与类型类一起使用时。也就是说,forall
使您的函数与许多遵循某个类型类的类型一起工作。
例子:
data ShowBox = forall s. Show s => SB s
好吧,我发现了一个真正的世界用法:
spock :: forall conn sess st. SpockCfg conn sess st ->
SpockM conn sess st () -> IO Middleware
<Source>
你可以在这里看到它使用的源代码forall
,但没有类型类约束:
spock :: forall conn sess st. SpockCfg conn sess st ->
SpockM conn sess st () -> IO Wai.Middleware
spock spockCfg spockAppl =
do connectionPool <-
case poolOrConn of
PCNoDatabase ->
{- ... -}
我对 Haskell 很陌生,并试图理解forall
.