假设我有这样的数据类型:
{-# LANGUAGE RankNTypes #-}
data X a = forall b. Show b => X (a b)
Run Code Online (Sandbox Code Playgroud)
我想得出Show (X a),但当然,如果有一个实例,我只能这样做Show (a b).我很想写
{-# LANGUAGE StandaloneDeriving #-}
deriving instance Show (a b) => Show (X a)
Run Code Online (Sandbox Code Playgroud)
但不幸的是,类型变量b在实例上下文中不可用,因为它受到forall的约束.
我的下一次尝试是将Show (a b)上下文移动到数据类型定义中的forall中,如下所示:
data X a = forall b. Show (a b) => X (a b)
deriving instance Show (X a)
Run Code Online (Sandbox Code Playgroud)
这编译,但不幸的是现在我已经失去了构建X一个不可思议的能力(a b).
有没有办法允许X用任何方法构造(a b),然后Show (X a) …
haskell ×1