Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Haskell:指编译时的值类型_Haskell_Types_Vinyl - Fatal编程技术网

Haskell:指编译时的值类型

Haskell:指编译时的值类型,haskell,types,vinyl,Haskell,Types,Vinyl,我想知道是否有一种很好的方法可以引用值的类型,而不用在代码中使用type(不是在运行时-这里没有具体化) 使用以下代码(使用): 这里有两个重复的类型:“name”:::String和“age”:::Int。如果我们重用多个记录中的字段,这可能会变成多个位置。尽管Person类型实际上是指组成字段,但类型声明是独立的。因此,将age更改为Float表示需要在不同的位置进行更改 显然,没有必要显式地键入内容,因为它们将被推断出来。然而,在我的例子中,记录类型是从选项解析器返回的,因此被导出。同样,

我想知道是否有一种很好的方法可以引用值的类型,而不用在代码中使用
type
(不是在运行时-这里没有具体化)

使用以下代码(使用):

这里有两个重复的类型:
“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]
但是,这将涉及另一个类型别名的加载,并将行数增加一倍。我希望能够写出以下内容:

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]
这会显式地将
人员的类型链接到其字段的类型


有没有一种方法(最好是无TH,但我甚至对涉及TH感兴趣)可以做到这一点

应该很容易用 下面。对于ghc7.6(至少),检查类型中的循环太糟糕了 同义词似乎阻止了更漂亮的
type Person=$(listOfT['name',age])
锻炼

{-# LANGUAGE DataKinds, TemplateHaskell, TypeOperators #-}
import Language.Haskell.TH
import Control.Applicative
import Data.Vinyl

name = Field :: "name" ::: String
age = Field :: "age" ::: Int

let listOfT (n:ns) = do
        VarI _ ty _ _ <- reify n
        (appT promotedConsT) (return ty) `appT` listOfT ns
    listOfT [] = promotedNilT
 in return <$> tySynD (mkName "Person") [] (listOfT ['name, 'age])
{-#语言数据类型,模板haskell,类型运算符#-}
导入语言.Haskell.TH
导入控制
导入数据。乙烯基
名称=字段::“名称”:::字符串
年龄=字段::“年龄”:::Int
让ListSoft(n:ns)=执行

说实话,我比较喜欢第一个版本的别名,而不是第二个版本的typeof。您甚至已经有了一个整洁的命名约定(字段小写,类型大写),模板Haskell有什么问题?这是解决你问题的好办法。我不知道乙烯基的世界观,但
lens
sems适合: