- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我可以使用如下类型系列将函数与空值分开:
type family Funs (ts :: [*]) :: [*]
where
Funs '[ ] = '[ ]
Funs ((a -> b): ts) = (a -> b): Funs ts
Funs (k: ts) = Funs ts
我想要的是分离满足约束的类型,例如Show
。类比尝试:
type family Showable (ts :: [*]) :: [*]
where
Showable '[ ] = '[ ]
Showable ((Show a => a): ts) = a: Showable ts
Showable (k: ts) = Showable ts
— 导致错误:
• Illegal qualified type: Show a => a
• In the equations for closed type family ‘Showable’
In the type family declaration for ‘Showable’
|
35 | Showable ((Show a => a): ts) = a: Showable ts
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
可以做什么?我对使用 Template Haskell 或任何类型的低级黑客技术的解决方案感到满意。
最佳答案
我不认为可以轻松地做到这一点(没有 TH),因为开放世界的假设:GHC 基本上永远不会解决类约束的负面问题,因为某个地方可能有更多实例可以实现它true(并且不能很好地使用 GHC/Haskell 使用的单独编译策略)。因此,通常不可能从纯“常规”Haskell 代码决定类型是否具有类实例,以及是否将其包含在列表中。
如果您愿意稍微破坏单独的编译,只需考虑您正在处理的模块编译时范围内的实例(即在该模块源文件的范围内) ,您可以使用 Template Haskell 或 GHC 类型检查器插件来获得与此行为非常相似的东西。我知道有几个实现在值(value)级别上做了类似的事情,包括 ifcxt和 constraints-emerge 。我相信这些库,尤其是 ifcxt(我稍微熟悉一点)非常简单:您可以使用 TH 函数 reify
来获取 ClassI
Info
对于特定类型类,并使用其 [InstanceDec]
字段来获取编译期间范围内的所有实例的列表。然后,您基本上可以为每个具体类型实例创建一个分支,将实例头添加到列表中,并在其后面添加一个不会添加实例头的包罗万象的分支。您可能还需要递归地执行此操作以处理本身具有约束的实例。
请注意,如果您选择使用此方法,这将以可能令人困惑的方式打破开放世界假设:如果模块导入类型级过滤器模块,然后定义数据类型/实例,则类型级过滤器将不知道新实例,并将继续将该类型视为没有实例。当您使用 TH 生成过滤器类型系列时,您需要确保您关心的所有实例都在范围内。
如果您想稍微改进这一点,您可以使用一种更像 IfCxt
的方法,其中您可以执行以下操作,而不是直接创建类型系列实例:
class IsShow (a :: Type) (b :: Bool) where
instance {-# OVERLAPPABLE #-} (b ~ 'False) => IsShow a b where
您的 TH 生成实例如下:
instance IsShow Int 'True where
这样做的优点是,如果另一个模块定义了重要的类型/实例,您应该能够使用(大致)相同的 TH 来使用这些新实例和您的类型来扩展 IsShow
的实例使用 IsShow
的家庭应该没问题。上面链接的 ifcxt 包基本上做同样的事情,但它没有做必要的技巧来获取类型级别的信息,而是生成函数来获取值级别的信息。
此解决方案使用具有功能依赖性的类而不是类型族,因为 OverlappingInstances
可以为基于类的解决方案提供“默认情况”。我不确定是否有任何合理的方法可以为 open 类型系列提供默认情况,因此您可能无法在到处使用类型系列时获得这种“可扩展性”(而不是fundep'd)实例)。
理查德·艾森伯格 says
With separate compilation, the lack of ordering and the overlap check are necessary for type soundness.
所以我认为这可能是不可能的。这里还有一些关于类型族与fundeps的有趣讨论:https://typesandkinds.wordpress.com/2015/09/09/what-are-type-families/
关于haskell - 我可以根据特定类别的可用性来过滤类型级别列表吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51165245/
是否可以使用 JHipster 5(带有 Spring Boot 2)?我注意到在发行说明中提到了 JHipster 5 的工作,但看不到任何关于如何安装/运行 5 的“预览”版本的信息。 最佳答案
使用多个显示器时,有没有办法拆分 Xcode 界面? 我有 2 台显示器,但仍然没有找到一种简单的方法在超过 1 台显示器上使用它(左侧的 Storyboard,右侧的代码) - 就像在 Androi
我正在尝试处理 uwp 应用程序中的 xml,我添加了引用和用法: using System.Xml; using System.Xml.XPath; 但是 private XmlDocument d
JSunit 真的是 Junit 到 Javascript 的直接端口吗?所以我听说过,但我想知道为什么我的公司没有使用它。我的公司有很多聪明人,所以如果我们不使用它,我想知道 Jsunit 作为 j
当使用原始 TCP 套接字时,需要进行消息帧化,如 here 所述,带有长度前缀或分隔符。 我今天遇到了“SOCK_SEQPACKET”套接字选项,它显然可以几乎透明地进行消息框架。 目前“SOCK_
我在一个小型开发小组工作。我们正在构建和改进我们的产品。 半年前我们无法考虑更高的特性,比如可用性,因为我们的产品有很多问题。许多错误、高技术债务、低性能和其他问题使我们无法专注于可用性。 随着时间的
是否可以通过编程方式控制@RestController来启用或禁用它?我不想只在每个 @RequestMapping 方法中编写代码来执行某种 if (!enabled) { return 404Ex
azure 的 blob 在被新版本覆盖时是否可供下载? 根据我使用 Cloud Storage Studio 的测试,下载被阻止,直到覆盖完成,但是我的测试来自同一台计算机,因此我无法确定这是正确的
我一直认为(但出于某种原因从未实践过)动态生成且仅包含一个项目的下拉菜单应该自动选择该项目。这与我观察到的典型方法相反,即在顶部创建一个空白条目,您仍然必须与菜单交互以进行单个可用选择。 例如,当我登
我正在为我的兄弟编写一个基于 Web 的小实用程序,他需要合并 CSV 文件中的列。我知道这样的事情肯定存在于某个地方,但这很大程度上是因为这是一个有趣的小练习。 无论如何,我正在尝试找出最好/最简洁
如您所知,pinterest api 现在似乎已关闭。( api.pinterest.com )在此站点中:http://tijn.bo.lt/pinterest-api ,它表示只读访问仍然有效。到
我想为公寓可用性应用程序制作日历 View 。我的想法是从 MySQL 数据库获取日期范围(不可用日期)并将其显示在日历 View 中。我的日历 View 应该有 3 种不同的样式: 可用日期 不可用
我究竟应该如何配置我的广播接收器以使我的应用程序响应 wifi 可用性的变化。不过,当应用程序未运行时,我并不真正关心对此使用react。 我在这里试图完成的是,当应用程序运行时,我需要使本地数据库与
在我的网络应用程序中,我有 parent 和保姆。 保姆将声明工作时间(时间间隔),该工作时间将存储在工作时间表中。 家长也会每隔一段时间表达自己的需求(暂时不需要存储)。 所以我设计了这样的可用性表
概览 我希望在 CloudKit 无法访问时收到通知。 CloudKit 可能无法访问的可能场景: CloudKit 服务器不可访问 互联网连接不可用。 迄今为止所做的尝试: 观察 CKAccount
好的,我有我为核心数据创建的类 LoginPass.h 然后我有头等舱 FirstClass.h 然后我需要在 SecondClass 中使用这些类,我在其中使用 @class 声明它们。头文件 Se
例如 linux kernel-2.6.32-279 没有在/usr/include/asm-generic/socket.h 中定义 SO_REUSEPORT 但 kernel-2.6.32-431
我正在尝试安装的工具说: MySQL server data directory needs to reside on an LVM volume 如何检查我的数据目录是否在 LVM 上? 最佳答案
这个问题在这里已经有了答案: 关闭 11 年前。 Possible Duplicate: Programmatically find device support GPS or not? 如何检查设
我听说汽车行业有一种叫做 MISRA C 的东西。 其他高可靠性/可用性/安全性行业的相关标准是什么,例如 空间 飞机 银行/金融 汽车 医疗 国防/军事 ??? -亚当 最佳答案 查看戈达德太空飞行
我是一名优秀的程序员,十分优秀!