首页 > 解决方案 > 关于限制的 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 语言的新手。在我刚开始工作的公司的代码仓库中,我无法破译某些代码中的类定义。这是在做什么?

标签: haskell

解决方案


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

我们正在定义一个多参数类型类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 关联类型族声明)。它需要 somem和 a pwhich 必须是类型k并导致约束。

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


推荐阅读