我想知道是否有一种很好的方法来引用值类型,而无需type
在代码中使用显式别名(不是在运行时 - 这里没有具体化)。
采用以下代码(使用Data.Vinyl):
{-# LANGUAGE DataKinds, TypeOperators #-}
import Data.Vinyl
name = Field :: "name" ::: String
age = Field :: "age" ::: Int
type Person = ["name" ::: String, "age" ::: Int]
这里我们有类型"name" ::: String
并"age" ::: Int
在两个地方重复。如果我们在多个记录中重用字段,这可能会变成多个地方。尽管Person
类型实际上是指组成字段,但类型声明是独立的。因此,更改age
为 表示Float
,需要在各个地方进行更改。
显然,没有必要显式键入内容,因为它们会被推断出来。但是,在我的情况下,记录类型是从选项解析器返回的,因此是导出的。同样,可以编写以下内容:
type Name = "name" ::: String
name = Field :: Name
type Age = "age" ::: Int
age = Field :: Age
type Person = [Name, Age]
然而,这涉及到另一个类型别名的负载和双倍的行数。我希望能够写的是以下内容:
name = Field :: "name" ::: String
age = Field :: "age" ::: Int
type Person = [typeof name, typeof age]
这将 a 的类型显式链接Person
到其字段的类型。
有没有办法(最好是 sans-TH,但我什至有兴趣涉及 TH)来做到这一点?