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