當你創建一個type
型代名詞,GHC/ghci中會使用它來代替原來的類型時,它明確地使用,但不會嘗試從推斷類型匹配的代名詞向後工作。爲一種類型獲取最「抽象」的同義詞將非常方便,可以學習複雜的應用程序和庫,它們定義monad堆棧的同義詞,並可能定義同義詞的同義詞。有沒有辦法在haskell中解析類型同義詞?
有沒有人寫過這麼一段代碼?我想它會回溯,它也會產生一些虛假的候選者(例如,如果兩種類型是字符串的別名,那麼它們都將是候選者,只要字符串必須被解析),但在某些情況下它可能是有用的。
當你創建一個type
型代名詞,GHC/ghci中會使用它來代替原來的類型時,它明確地使用,但不會嘗試從推斷類型匹配的代名詞向後工作。爲一種類型獲取最「抽象」的同義詞將非常方便,可以學習複雜的應用程序和庫,它們定義monad堆棧的同義詞,並可能定義同義詞的同義詞。有沒有辦法在haskell中解析類型同義詞?
有沒有人寫過這麼一段代碼?我想它會回溯,它也會產生一些虛假的候選者(例如,如果兩種類型是字符串的別名,那麼它們都將是候選者,只要字符串必須被解析),但在某些情況下它可能是有用的。
不是一個答案,而是一個問題。類型同義詞通常用於在「高級代碼」中很好地命名類型,但只要您將這些類型傳遞到較低級別/幫助程序代碼(用更具體的類型定義),系統應該如何跟蹤哪些類型同義詞適用?考慮以下幾點:
type Title = String
type Name = String
capitalise :: String -> String
my_title = "Mayor" :: Title
shouted_title = capitalise my_title :: ???
怎樣的typechecker知道字符串進入heleper功能capitalise
在概念上是相同的類型出來的capitalise
字符串?在多種類型別名的情況下,類型檢查器應該如何選擇使用哪一個?
的弗雷格編譯器,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類型別名,因此輸出實際上可能會產生誤導。
我一直在玩弄同樣的想法,因爲這對'管道和透鏡'非常有用。理想情況下,您可以指定某種類似於規則的編譯器雜注,匹配推斷類型的模式並將其重寫爲等效類型同義詞(如果存在多個匹配,則使用某種優先級)。 –
我想起一個博客帖子我前幾天看裏面提到「Chthulu的類型簽名」的:http://joelt.io/entries/yesod-in-production – BruceBerry
聽起來有點像好了GSOC或類似 – jozefg