关于限制的Haskell类定义问题

时间:2019-02-27 22:38:26

标签: haskell

class IndexSelect k (m :: k -> (* -> *) -> *) | m -> k where
    type Restriction m (p :: k) :: Constraint
    indexSelect :: Restriction m p => Sing (p :: k) -> Proxy m -> LocalDb f -> f (TableEntity (m p))

我是Haskell语言的新手。我在刚成立的公司的代码存储库中的某些代码中无法解密类定义。 这是做什么的?

1 个答案:

答案 0 :(得分:3)

这里发生了很多事情。首先,请参考GHC语言扩展文档的7.6 Class and Instance Declarations7.7 Type Families7.8.4 Explicitly-kinded qualifications部分。 (我绝不是这方面的专家,而是单击您的问题希望有人提供了进一步的启发。)

我们正在定义一个名为IndexSelect的多参数类型类,其参数为km。 (多参数类型类7.6.1.1)

该类的第二个参数m具有明确的种类限定:英语k -> (* -> *) -> *中的m必须是一个带有k的函数和一个函数并返回一个值。 (7.8.4显式量化)

该类具有功能依赖性| m -> k。在给定该函数名称的情况下,m的选择必须唯一地确定k的含义,这意味着集合m必须只有一种合理的键k。 (7.6.2功能依赖)

该类形成一个索引类型族type Restriction m (p :: k) :: Constraint。它出现在类定义中,因此是一个关联的类型同义词。 (7.7.2.1.1关联类型族声明)。它需要一些m和一个p,它们必须是k类型,并产生约束。

该类有一个列出的方法indexSelect,您可能会猜测该方法设法从集合中提取信息。不知道SingLocalDbTableEntity是什么,我不能说更多。