表示有效类型的 Haskell 数据类型

Posted

技术标签:

【中文标题】表示有效类型的 Haskell 数据类型【英文标题】:Haskell data type that represents valid types 【发布时间】:2017-03-03 01:34:19 【问题描述】:

是否有一个库定义了定义有效 Haskell 类型的数据类型(可能是 GADT)。

为了解释,让我建议这可能是什么样子:

data A
data B

class Free t
instance Free A
instance Free B

x = Forall A (Forall B (Constraint (NumConstraint A) 
      (Constructor Function A (Constructor Function B A))))

这将表示:

forall a b. Num a => a -> b -> a

我并不是说我所建议的是一个好的实现,我只是想表明我的意思。

当然,如果您可以定义类型定义的语法,您就可以创建一个 GADT 来表示它。有什么已经这样做了吗?

【问题讨论】:

为什么是 GADT 而不是 ADT? template-haskell 是你要找的吗? 我不介意它是否是 GADT,只要我能做到漂亮打印它们等。 【参考方案1】:

您正在寻找the type-related ADTs in template-haskell。请注意TypePpr 的一个实例,它具有ppr 漂亮打印功能。

ghci> import Language.Haskell.TH
ghci> :
ghci> x <- runQ $ do
ghci|        a <- newName "a"
ghci|        b <- newName "b"
ghci|        pure $ ForallT [PlainTV a,PlainTV b] [AppT (ConT (mkName "Num")) (VarT a)] (AppT (AppT ArrowT (VarT a)) (AppT (AppT ArrowT (VarT b)) (VarT a)))
ghci| :
ghci> x
ForallT [PlainTV a_4,PlainTV b_5] [AppT (ConT Num) (VarT a_4)] (AppT (AppT ArrowT (VarT a_4)) (AppT (AppT ArrowT (VarT b_5)) (VarT a_4)))
ghci> ppr x
forall a_0 b_1 . Num a_0 => a_0 -> b_1 -> a_0

事实上,GHC 的TemplateHaskell 语言扩展将使玩这个游戏变得非常容易。不必写出ForallT ... 的东西,我可以“引用”我正在寻找的类型

ghci> :set -XTemplateHaskell -XExplicitForall
ghci> x' <- runQ [t| forall a b. Num a => a -> b -> a |]

x'x 相同(也许ab 最终会略有不同Names,但仍然如此)!

【讨论】:

以上是关于表示有效类型的 Haskell 数据类型的主要内容,如果未能解决你的问题,请参考以下文章

为啥 Haskell 中有“数据”和“新类型”? [复制]

让Haskell区分类型同义词

为啥 Haskell 没有在函数签名中推断数据类型的类型类?

Haskell 数据类型实例作为运算符

Haskell 术语:类型与数据类型的含义,它们是同义词吗?

初识Haskell 五:自定义数据类型和类型类