2013-08-05 61 views
13

當你創建一個type型代名詞,GHC/ghci中會使用它來代替原來的類型時,它明確地使用,但不會嘗試從推斷類型匹配的代名詞向後工作。爲一種類型獲取最「抽象」的同義詞將非常方便,可以學習複雜的應用程序和庫,它們定義monad堆棧的同義詞,並可能定義同義詞的同義詞。有沒有辦法在haskell中解析類型同義詞?

有沒有人寫過這麼一段代碼?我想它會回溯,它也會產生一些虛假的候選者(例如,如果兩種類型是字符串的別名,那麼它們都將是候選者,只要字符串必須被解析),但在某些情況下它可能是有用的。

+0

我一直在玩弄同樣的想法,因爲這對'管道和透鏡'非常有用。理想情況下,您可以指定某種類似於規則的編譯器雜注,匹配推斷類型的模式並將其重寫爲等效類型同義詞(如果存在多個匹配,則使用某種優先級)。 –

+1

我想起一個博客帖子我前幾天看裏面提到「Chthulu的類型簽名」的:http://joelt.io/entries/yesod-in-production – BruceBerry

+0

聽起來有點像好了GSOC或類似 – jozefg

回答

1

不是一個答案,而是一個問題。類型同義詞通常用於在「高級代碼」中很好地命名類型,但只要您將這些類型傳遞到較低級別/幫助程序代碼(用更具體的類型定義),系統應該如何跟蹤哪些類型同義詞適用?考慮以下幾點:

type Title = String 
type Name = String 

capitalise :: String -> String 

my_title = "Mayor" :: Title 

shouted_title = capitalise my_title :: ??? 

怎樣的typechecker知道字符串進入heleper功能capitalise在概念上是相同的類型出來的capitalise字符串?在多種類型別名的情況下,類型檢查器應該如何選擇使用哪一個?

0

的弗雷格編譯器,IDE和REPL嘗試類型的應用程序做到這一點(除的(應用程序 - >)),當他們被要求出示「好」類型,以及它在大多數情況下工作。下面是一個例子online session片段:

frege> type Flubber = (Int, Double) 
frege> x = (42, 3.0) 
frege> :t x  
Flubber 
frege> y = [x,x,x,x] 
frege> :t y 
[Flubber] 

因此,在原則上,也應該在Haskell工作(也許模型系統相對於2010哈斯克爾一定的擴展)。

請記住,雖然, - 如@Thomas在他的回答中指出 - 可能有多種方式來unsubstitute類型別名,因此輸出實際上可能會產生誤導。

相關問題