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语言的新手。我在刚成立的公司的代码存储库中的某些代码中无法解密类定义。 这是做什么的?
答案 0 :(得分:3)
这里发生了很多事情。首先,请参考GHC语言扩展文档的7.6 Class and Instance Declarations,7.7 Type Families和7.8.4 Explicitly-kinded qualifications部分。 (我绝不是这方面的专家,而是单击您的问题希望有人提供了进一步的启发。)
我们正在定义一个名为IndexSelect
的多参数类型类,其参数为k
和m
。 (多参数类型类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
,您可能会猜测该方法设法从集合中提取信息。不知道Sing
,LocalDb
和TableEntity
是什么,我不能说更多。