关于限制的Haskell类定义问题

ddt*_*ler 7 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))
Run Code Online (Sandbox Code Playgroud)

我是Haskell语言的新手.我在我刚刚开始的公司的代码库中的某些代码中解密类定义时遇到了麻烦.这是做什么的?

Joh*_*ler 3

这里发生了很多事情。首先,我将向您介绍GHC 语言扩展文档的第 7.6 节“类和实例声明”第 7.7 节“类型族”7.8.4 节“显式限定” 。(我绝不是这些方面的专家,点击你的问题希望有人能提供进一步的启发。)

IndexSelect我们正在定义一个名为参数k和的多参数类型类m。(多参数类型类别7.6.1.1)

类的第二个参数m被赋予显式类型限定:k -> (* -> *) -> *在英语中m必须是一个接受 ak和一个函数并返回一个值的函数。(7.8.4 显式量化)

该类具有函数依赖性| m -> k。其中 的选择m必须唯一确定 给k定该函数的名称意味着集合m必须只有一种k合理的键。(7.6.2 功能依赖性)

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

该类有一个列出的方法indexSelect,人们可能会猜测该方法设法从集合中提取信息。在不知道什么SingLocalDb做什么的情况下TableEntity,我无法说更多。

  • 我猜测 `Sing` 来自 [`singletons`](https://hackage.haskell.org/package/singletons) 包。 (3认同)