相关疑难解决方法(0)

有条件地派生出类型构造函数参数化的存在类型的Show

假设我有这样的数据类型:

{-# 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

6
推荐指数
2
解决办法
433
查看次数

标签 统计

haskell ×1