提问人:radrow 提问时间:2/24/2022 更新时间:2/24/2022 访问量:860
:~: 和 :~~: equalities 和有什么不一样?
What is the difference between :~: and :~~: equalities?
问:
在 Data.Type.Equality
中,定义了两个类型级等式:和 。据说它们分别代表同质和异质平等,但我真的看不出它们之间有任何区别。这是什么?:~:
:~~:
老实说,我看不出有什么方法可以在 Haskell 类型中实现真正的异构相等,因为类型系统中的值、类型和种类之间存在严格的边界。
答:
区别在于它们的种类:
type (:~:) :: k -> k -> Type
type (:~~:) :: k1 -> k2 -> Type
前者只接受两个具有相同类型的类型参数,而后者则没有这样的限制。
该类型是 bad-kinded(它会触发 kind 错误),而 well 是 well-kinded。后者是空的,但至少我们可以在不触发错误的情况下编写它。Bool :~: Maybe
Bool :~~: Maybe
这很简单。
ghci> :k (:~:)
(:~:) :: k -> k -> *
ghci> :k (:~~:)
(:~~:) :: k1 -> k2 -> *
请注意,Data.Type.Equality
声明这是“种类异构命题相等”(强调我的),因此您需要查看种类。:~~:
基本上类似于术语级别,因为使用它需要您要检查相等的两种类型是同一类型的成员。不同种类的类型(如不同类型的术语)绝对不相等,但是使用(like with)时,您甚至会因为考虑问题而被拉起。:~:
==
:~:
==
但是,即使您尚未确定这两种类型具有相同的类型,也可以使用。当类型(以及种类)不相等时,您将无法构造 a,但是当它们没有相同的类型时,GHC 可以考虑(空)类型的存在,这与 .:~~:
Refl :: a :~~: b
a :~~: b
a :~: b
因此,您可以在某些无法使用的情况下使用 .但有时这种灵活性实际上是一个问题。如果希望两端具有相同的类型,则将它们与编译器进行比较会为编译器添加该信息(编译器可能需要它来解析类型类实例或类型系列等)。如果你使用它,除了在构造函数的实际模式匹配范围内之外,没有说明种类相等,所以如果你想要的话,你可能必须想出另一种方法来添加关于种类相等的信息。:~~:
:~:
:~:
:~~:
Refl
评论
:~:
:~~:
:~:
base
:~~:
base
:~~:
:~:
asTypeOf
Type
*
评论
Type.Reflection
需要异构相等