这个GHC功能叫什么`forall`在类型定义中



我了解到,您可以从transformers中重新定义ContT,从而使r类型参数隐式(并且可以使用TypeApplications显式指定(,即:

-- | Same as `ContT` but with the `r` made implicit
type ContT ::
forall (r :: Type).
(Type -> Type) ->
Type ->
Type
data ContT m a where
ContT ::
forall r m a.
{runContT :: (a -> m r) -> m r} ->
ContT @r m a
type ContVoid :: (Type -> Type) -> Type -> Type
type ContVoid = ContT @()

我没有意识到这在GHC是可能的。用隐式类型参数定义类型族的这种方式,即在类型定义中使用forall指定(在上面的示例中,指的是外部forall-而不是内部forall,后者只是统一了r(,调用的更大的功能是什么?

没有人为此目的(在不使用依赖项的情况下(使用this(不可见的依赖量化(,但它与隐式提供Type -> ..参数相同。

type EITHER :: forall (a :: Type) (b :: Type). Type
data EITHER where
LEFT  :: a -> EITHER @a @b
RIGHT :: b -> EITHER @a @b
eITHER :: (a -> res) -> (b -> res) -> (EITHER @a @b -> res)
eITHER left right = case
LEFT  a -> left  a
RIGHT b -> right b

您也可以使用";可见依赖定量";其中forall->forall.的可见对应物,因此forall (a :: Type) -> ..适当地类似于Type -> ..,其中a不出现在

type EITHER :: forall (a :: Type) -> forall (b :: Type) -> Type
data EITHER a b where
LEFT  :: a -> EITHER a b
RIGHT :: b -> EITHER a b
eITHER :: (a -> res) -> (b -> res) -> (EITHER a b -> res)
eITHER left right = case
LEFT  a -> left  a
RIGHT b -> right b

相关内容

  • 没有找到相关文章

最新更新