haskell - 关于限制的 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 语言的新手。在我刚开始工作的公司的代码仓库中,我无法破译某些代码中的类定义。这是在做什么?
解决方案
这里发生了很多事情。我将首先向您介绍 GHC 语言扩展文档的第7.6 节类和实例声明、第7.7 节类型族和第7.8.4 节明确类型的限定。(我绝不是任何这些方面的专家,并点击了您的问题,希望有人提供了进一步的启发。)
我们正在定义一个多参数类型类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 关联类型族声明)。它需要 somem
和 a p
which 必须是类型k
并导致约束。
该类有一个列出的方法indexSelect
,人们可能会猜测它设法从集合中提取信息。不知道是什么Sing
,我不能说更多。LocalDb
TableEntity
推荐阅读
- kubernetes - 如何使用 istio 多集群实现集群本地服务?
- google-calendar-api - 发送到谷歌日历的 Outlook 事件 - 事件 ID 意外更改?
- python - 在 2 个 pandas 数据帧中计数匹配
- php - 我在哪里可以找到默认 PHP 使用的默认系统证书?
- ruby - 带有惰性键的 Ruby 哈希
- c++ - 在匿名命名空间中使用模板函数
- acumatica - 将 Excel 上传功能添加到员工考勤卡条目不显示 ProjectTask 字段
- http - 使密码重置链接过期的确切目的是什么?
- uwp - 如何使用 Windows.Services.Maps.LocalSearch API/命名空间?
- sql - SQL 匹配包含字符串的字符串