这个 GHC 功能叫什么?类型定义中的`forall`
What is this GHC feature called? `forall` in type definitions
我了解到您可以从 transformers 重新定义 ContT
,这样 r
类型参数就成为 implicit(并且可以指定明确使用 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 中是可能的。什么是更大的功能调用来引用这种使用 implicit 类型参数定义类型族的方式,即在类型定义中使用 forall
指定(指的是,在示例中上面,到外部 forall
- 而不是简单统一 r
)?
的内部 forall
没有人将此(不可见依赖量化)用于此目的(未使用依赖性的地方),但它与隐含地提供 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
我了解到您可以从 transformers 重新定义 ContT
,这样 r
类型参数就成为 implicit(并且可以指定明确使用 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 中是可能的。什么是更大的功能调用来引用这种使用 implicit 类型参数定义类型族的方式,即在类型定义中使用 forall
指定(指的是,在示例中上面,到外部 forall
- 而不是简单统一 r
)?
forall
没有人将此(不可见依赖量化)用于此目的(未使用依赖性的地方),但它与隐含地提供 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