FunctionalDependencies

如果你有一個帶引數 a,b,c 和 x 的多引數型別類,則此副檔名允許你表示可以從 a,b 和 c 唯一標識型別 x:

class SomeClass a b c x | a b c -> x where ...

在宣告此類的例項時,將針對所有其他例項檢查它以確保函式依賴性成立,即,不存在具有相同 a b c 但存在不同 x 的其他例項。

你可以在逗號分隔的列表中指定多個依賴項:

class OtherClass a b c d | a b -> c d, a d -> b where ...

例如在 MTL 中,我們可以看到:

class MonadReader r m| m -> r where ...
instance MonadReader r ((->) r) where ...

現在,如果你有一個 MonadReader a ((->) Foo) => a 型別的值,編譯器可以推斷 a ~ Foo,因為第二個引數完全決定了第一個,並將相應地簡化型別。

SomeClass 類可以被認為是導致 x 的引數 a b c 的函式。這些類可用於在型別系統中進行計算。