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
找到答案。