5

我無法真正瞭解它。我們爲什麼需要它?我的意思是如果我使用相同的類型參數,我認爲這意味着它們應該是相同的類型。Haskell的函數依賴關係

我聽說它可以幫助編譯器避免無限循環。有人能告訴我更多關於這方面的細節嗎?最後,在真實世界的Haskell中,我們應該遵循什麼樣的模式和實踐來使用函數依賴嗎?

[後續問題]

class Extract container element where 
    extract :: container -> element 

instance Extract (a,b) a where 
    extract (x,_) = x 

在上面的代碼中,我使用的相同類型變量「a」爲兩個容器和元件,我想因此,編譯器可以推斷,這兩種類型的是同一類型。

但是,當我在GHCI嘗試這種代碼,我得到了以下意見:

*Main> extract('x',3) 
<interactive>:1:0: 
    No instance for (Extract (Char, t) element) 
     arising from a use of `extract' at <interactive>:1:0-13 
    Possible fix: 
     add an instance declaration for (Extract (Char, t) element) 
    In the expression: extract ('x', 3) 
    In the definition of `it': it = extract ('x', 3) 

當其中一人已被指定爲類型「字符」,爲什麼另一種是仍然沒有得到解決型「元素「?

+5

確實http://www.haskell.org/haskellwiki/Functional_dependencies有幫助嗎? – lijie 2010-11-25 14:36:19

回答

6

我認爲這個explains它相當不錯。所以基本上如果你有一個FD關係 - > b所有這意味着對於類型實例只能有一個'b'與任何'a'這樣Int Int,但你也不能有Int Float 。這就是他們所說的'b'由'a'唯一確定的含義。這擴展到任何數量的類型參數。它需要的原因是1.類型推理2.有時候你想要一個這樣的約束。

FD的替代方案是類型族擴展,但不適用於所有FD的情況。

+0

感謝您的反饋。那篇文章很棒。現在我確切知道我真正的問題是什麼。你說'有時候你想要這樣的限制'。我理解這部分。但我不明白爲什麼它需要類型推斷。我用另一個後續問題更新了我的問題。這個例子來自你上面提到的wiki頁面。 – aXqd 2010-11-26 14:12:40