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