haskell - 是否可以在 Haskell 中否定类型参数约束?
问题描述
在 Haskell 中,可以为类型参数添加约束。
例如:
foo :: Functor f => f a
问题:是否可以否定约束?
我想说这f
可以是除Functor
示例之外的任何内容。
升级版:
所以它来自如何映射底部嵌套的Functor的想法。假设我有Functor a
wherea
可以是Functor b
或不是,并且相同的规则适用于b
.
解决方案
这不可能的原因:(基本上都是相同的原因,只是它的不同方面)
- 关于类型类有一个开放世界的假设。不可能证明一个类型不是类的实例,因为即使在编译模块期间,实例不存在,这并不意味着有人没有在模块中“进一步定义”马路”。这原则上可以在一个单独的包中,这样编译器就不可能知道该实例是否存在。
(这种孤儿实例通常很不受欢迎,但它们有一些用例,并且语言不会试图阻止这种情况。) - 类中的成员资格是一种直观的属性,这意味着您不应将其视为经典的布尔值“实例或非实例”,而是,如果您可以证明一个类型是实例,那么这将为您提供某些特性类型(由类方法指定)。如果你不能证明该类型是一个实例,那么这并不意味着没有实例,而可能只是你不够聪明来证明它。(阅读,“也许没有人足够聪明”。)
这与第一点有关:编译器还没有可用的实例是“不够聪明”的一种情况。 - 一个类不应该用于对类型是否在其中进行分派,而是用于启用某些多态函数,即使它们需要类型上的特殊条件。这就是类方法的作用,它们可以来自类实例,但它们怎么可能来自“非类实例”呢?
现在,说了这么多,有一种方法可以伪造这个:使用重叠的实例。不要这样做,这是一个坏主意,但是......这是你能得到的最接近的。
推荐阅读
- r - 返回的行名满足 rle 函数的条件
- c# - 无法在 asp.net 中使用 7zip 归档和取消归档文件
- ios - Testflight 与 App Store 安装(不丢失数据)
- python - 来自图像中非整数位置的 skimage 样本?
- mongodb - 从多个 kafka 分区读取数据时对流进行排序
- elasticsearch - Elasticsearch:获取记录的排序索引
- laravel - 使用 laravel 的动态产品
- javascript - Brain.js 倒数/反向训练(从输出预测输入)
- visual-studio-code - VSCode 不默认为 \n 行尾
- git - Git reset --soft HEAD~40 抛出错误