小编afu*_*ous的帖子

用GADT构造类型类的具体类型

这样做的灵感来自于创建一个值列表Show.我找到了以下使用GADT创建具体Showable类型的代码片段.

data Showable where Showable :: Show a => a -> Showable

instance Show Showable where
    show (Showable x) = show x

list :: [Showable]
list = [Showable 4, Showable "hello", Showable 'a']
Run Code Online (Sandbox Code Playgroud)

然后,我尝试Showable通过创建一个可以使任何类型类具体的类型来更加通用.

data Concrete a where Concrete :: a b => b -> Concrete a

instance Show (Concrete Show) where
    show (Concrete x) = show x

list :: [Concrete Show]
list = [Concrete 4, Concrete "hello", Concrete 'a']
Run Code Online (Sandbox Code Playgroud)

这适用于ConstraintKinds和FlexibleInstances语言扩展,但为了使用Concrete其他类型类的具体类型,每个类型都需要一个新实例.

有没有办法创建类似的东西 …

haskell typeclass gadt

2
推荐指数
1
解决办法
91
查看次数

标签 统计

gadt ×1

haskell ×1

typeclass ×1