2012-12-08 48 views
-1

給定一個涉及類型變量的類型,是否有一種方法可以定義一個類型變量的無限列表,其中沒有類型變量會重複?類型變量的無限列表 - 類型推斷

讓我提供更多的背景與我的問題。我正在做一個我自己在Haskell中的類型推斷。我的數據類型如下所示:

data Ty = TyUnit 
     | TyVar String 
     | TyBool 
     | TyInt 
     | TyBoolList 
     | TyIntList 
     | Arrow Ty Ty 

我給出了上述類型的定義。我相信該函數應該生成一個無限的變量名稱列表。我只是困惑於如何進行和問題的實際執行。

+0

您是否指Ty對象的列表,以便使用所有可能的組合並且不重複? –

+1

我不確定在構建類型推理器時,這是否是您需要的東西,除了潛在的非終止蠻力方法。據我瞭解,你通常需要像'freshTyVars = map(TyVar。(「_fresh _」++)。show)[0 ..]',或者實際上'輸入FreshVars = [String]'並將它們插入到'TyVar單曲。 – 2012-12-08 12:30:05

回答

1

你在這裏。

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 

allTys n構造高度爲n的類型樹。這裏Arrow x y的高度是x的高度+ y + 1的高度,其他的高度都是0.構造是非常基本的。我不確定它是否可以更快地完成。在評論中詢問是否需要更多解釋。

此外,在需要的情況下,這是如何獲取字母表中的所有字符串(如['a'..'z'])。

strings alphabet = (:) [] $ liftM2 (flip (:)) (strings alphabet) alphabet 

長字符串是somechar:shortstring的想法。請注意,包含空字符串。

+0

-1:這個問題需要一個無限的類型變量列表,所以這不是一個解決方案。 –

+0

@cebewee,你認爲他只想要TyVar的清單嗎?我根據「FreshTyVars應該生成非重複類型的無限列表」來寫答案,這意味着它可能是無限嵌套的箭頭語句「。 –

+0

Juodele:問題開始於:「給定一個類型FreshVars = [Ty],是否有一種方法可以定義一個類型變量的無限列表,其中沒有任何類型變量會被重複」。但你是對的,後來他談到了一般類型。我不會 - ( - 1)(儘管我猜這不是他想要的),但是我的投票現在被鎖定了。 –