Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/git/24.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_Type Inference - Fatal编程技术网

Haskell 类型变量的无限列表-类型推断

Haskell 类型变量的无限列表-类型推断,haskell,type-inference,Haskell,Type Inference,给定一个包含类型变量的类型,有没有办法定义一个类型变量的无限列表,其中没有重复的类型变量 让我为我的问题提供更多的背景。我正在Haskell做我自己的类型推断。我的数据类型如下所示: data Ty = TyUnit | TyVar String | TyBool | TyInt | TyBoolList | TyIntList | Arrow Ty Ty 我给出了上述类型的定义。我相信函数应该生成

给定一个包含类型变量的类型,有没有办法定义一个类型变量的无限列表,其中没有重复的类型变量

让我为我的问题提供更多的背景。我正在Haskell做我自己的类型推断。我的数据类型如下所示:

data Ty = TyUnit
        | TyVar String
        | TyBool
        | TyInt
        | TyBoolList
        | TyIntList
        | Arrow Ty Ty
我给出了上述类型的定义。我相信函数应该生成一个无限的变量名列表。我只是对如何进行以及问题的实际实施感到困惑。

给你

allTys 0 = TyUnit : TyVar "?" : TyBool : TyInt : TyBoolList :  TyIntList : []
allTys n = [0..n-1] >>= (\i -> liftM2 Arrow (allTys i) (allTys (n-1-i))) 

allTypes = [0..] >>= allTys
alltysn
构造高度为n的类型树。此处
箭头xy的高度
是x+y+1的高度,其他所有的高度都是0。建筑是非常基本的。我不确定是否能做得更快。如果需要更多解释,请在评论中提问

此外,如果需要,这就是如何获取字母表的所有字符串(例如
['a'..'z']


长字符串是
somechar:shortstring
的概念。请注意,其中包括空字符串。

您是指Ty对象的列表,以便使用所有可能的组合并且不重复?我不确定这是否是您在构建类型推断器时,除了潜在的非终止暴力方法之外,还需要的东西。据我所知,您通常需要像
freshTyVars=map(TyVar.(“\u fresh_“+).show)[0..]
,或者实际上是
type FreshVars=[String]
,并将它们插入
TyVar
s.-1:这个问题需要一个类型变量的无限列表,所以这不是一个解决方案。@cebewee,你认为他只想要一份TyVar的名单吗?我的回答是基于“FreshTyVars应该生成一个无限长的非重复类型列表,这意味着它可以是无限多个嵌套的Arrow语句。”Juodele:问题从“给定一个类型FreshVars=[Ty],有没有一种方法可以定义一个无限长的类型变量列表,其中没有重复的类型变量”。但你是对的,后来他谈到一般类型。我会un-(-1)(虽然我猜这不是他想要的),但我的投票现在被锁定了。@juodele我在思考这个问题,我相信这个问题要求生成一个无限的变量名列表,这些变量名都是unique@NuNu,这是你的问题,你为什么要思考它在问什么?所以你只想要一个无限的字符串列表?类型与此有什么关系?
strings alphabet = (:) [] $ liftM2 (flip (:)) (strings alphabet) alphabet