明星类型的单身人士平等

时间:2016-02-19 21:39:07

标签: haskell

我在ghci做过:

> :set -XTypeOperators

> import Data.Proxy
> import Data.Type.Equality
> import Data.Singletons.Prelude

> :let p1 = Proxy :: Proxy (Int == Int)
> :let p2 = Proxy :: Proxy (Int :== Int)

> :t p1
p1 :: Proxy 'True
> :t p2
p2 :: Proxy (Int :== Int)

为什么不计算第二种情况类型?我可以以某种方式解决它吗?我可以为类PEq创建一个实例(其中:==已定义)?

(ghc 7.10.3)

更新: 我找到了如何制作一个实例。是否有一些理由说明它不包括在内?

> instance PEq ('KProxy :: KProxy *) where { type (:==) x y = x == y }

或简单(在评论中由dfeuer指出)

> instance PEq ('KProxy :: KProxy *)

或从TypeRepStar导入此实例:

> import Data.Singletons.TypeRepStar()

1 个答案:

答案 0 :(得分:0)

PEq中不包括*实例singletons的原因似乎与Eq中不包含base的多边形实例相似}}。它被描述为here。这种情况太常见了,如果它存在,我们无法描述,例如类型函数结果的类型参数的等价性。例如:

Succ n == Succ m = n == m

对于singletons的解决方法,可以定义它:

instance PEq ('KProxy :: KProxy *)

或者只是使用它:

import Data.Singletons.TypeRepStar()