Haskell &引用;“模式匹配”;并对封闭类型族中的类型进行递归,以证明类型相等

Haskell &引用;“模式匹配”;并对封闭类型族中的类型进行递归,以证明类型相等,haskell,type-families,Haskell,Type Families,假设情况如下: data Foo a = Foo type family AlwaysInt a where AlwaysInt (Foo a) = AlwaysInt a AlwaysInt _ = Int 我想证明,在a中总是Int import Data.Type.Equality lemma :: AlwaysInt a :~: Int lemma = undefined 我如何证明这一点?我想对类型族定义中的每种类型进行“模式匹配”,因为我可以证明每种情况下

假设情况如下:

data Foo a = Foo

type family AlwaysInt a where
  AlwaysInt (Foo a) = AlwaysInt a
  AlwaysInt _       = Int
我想证明,
在a
中总是
Int

import Data.Type.Equality

lemma :: AlwaysInt a :~: Int
lemma = undefined
我如何证明这一点?我想对类型族定义中的每种类型进行“模式匹配”,因为我可以证明每种情况下的引理,但是如何进行这种模式匹配呢

丑陋的解决方法是在
引理中添加一个
a
参数,并在那里留下
未定义的
,或者放一条
错误
消息,但这在现实生活中并不好

编辑:忘记实际问题

:~:
是当
a
等于
b
时有人居住的GADT。在这种情况下,居民被称为
Refl
。GHC足够聪明,能够理解在这种情况下这两种类型是相同的。这就编译了

{-# LANGUAGE TypeFamilies, TypeOperators #-}

import Data.Type.Equality

data Foo = Foo

type family AlwaysInt a
  AlwaysInt Foo = Int
  AlwaysInt _   = Int

lemma :: AlwaysInt a :~: Int
lemma = Refl
如果我们将
Int
中的一个更改为其他类型,我们将得到一个类型错误,因为
Refl
不是
的成员(奇怪的事情):~:Int

您无法证明这一点

import Data.Type.Equality

lemma :: AlwaysInt a :~: Int
lemma = undefined
type family Any where {}
type family ManyFoo where
  ManyFoo = Foo ManyFoo
在任何
中,
始终是什么
Any
是一个卡住的类型,因此GHC将无法减少类型族应用程序

在很多人中,
始终是什么?嗯,
ManyFoo
是一种无限类型

ManyFoo = Foo (Foo (Foo ...))

因此,GHC将进入一个无限循环,试图计算它,或者试图在许多情况下计算

哦,是的,很好!当我把现实世界的例子缩小到一个MWE的时候,我好像忘了发布实际的问题。。。现在更新的问题怎么样?是的,但这两种类型都没有人居住过。既然我已经需要编写
引理::a->Alwaysina:~:Int
来消除歧义类型,我可以证明吗?@Turion,你不需要
a
来避免歧义类型;您只需要一个
代理
ManyFoo
显然不是无人居住的。如果您添加了一个
Typeable
约束,并确定您肯定没有
Foo
(使用
Type.Reflection
)的应用程序,那么您可以安全地
unsafeccource
找到答案。