我了解到,您可以从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