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 的函数。这些类可用于在类型系统中进行计算。