haskell - “模式匹配”并递归封闭类型族中的类型以进行类型相等证明
问题描述
假设这样的情况:
data Foo a = Foo
type family AlwaysInt a where
AlwaysInt (Foo a) = AlwaysInt a
AlwaysInt _ = Int
我想证明AlwaysInt a
永远是Int
。
import Data.Type.Equality
lemma :: AlwaysInt a :~: Int
lemma = undefined
我如何证明这一点?我想对类型族定义中的每种类型进行“模式匹配”,因为我可以证明每种情况的引理,但是我该如何进行这样的模式匹配呢?
丑陋的解决方法是添加一个a
参数lemma
并离开undefined
那里或放置一条error
消息,但这在现实生活中并不是很好。
编辑:忘记实际问题
解决方案
你无法证明这一点。
type family Any where {}
type family ManyFoo where
ManyFoo = Foo ManyFoo
是什么AlwaysInt Any
?Any
是一个卡住的类型,所以 GHC 将无法减少类型族应用。
是什么AlwaysInt ManyFoo
?嗯,ManyFoo
是无限类型,
ManyFoo = Foo (Foo (Foo ...))
所以 GHC 会进入一个无限循环,试图计算它或试图计算AlwaysInt ManyFoo
.
推荐阅读
- r - 如何将 lua-filter 与 bookdown gitbook 输出一起使用?
- eclipse - 我无法在 Eclipse 中导入 Java EE 注释,例如 @EJB 和 @Stateless,而是 eclipse 建议我创建它们
- excel - Excel VBO - Blue Prism 中的数据透视表报表布局
- spring-boot - java.lang.ClassCastException:实体 A 与实体 B 不兼容
- php - 在开关内声明数组并设置值
- flutter - 将文本拟合/绘制到颤动的形状?
- css - 在 WordPress Gutenberg 图像块中为图像添加阴影
- python - python使用多个条件创建一个新列
- sql-server - SQL Server NEWSEQUENTIALID() - 超快速 .net 核心实现的说明
- css - 我正在尝试纠正纯CSS中三个图像的无限翻转、旋转、旋转和消失的动画持续时间和时间线