我在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()
答案 0 :(得分:0)
PEq
中不包括*
实例singletons
的原因似乎与Eq
中不包含base
的多边形实例相似}}。它被描述为here。这种情况太常见了,如果它存在,我们无法描述,例如类型函数结果的类型参数的等价性。例如:
Succ n == Succ m = n == m
对于singletons
的解决方法,可以定义它:
instance PEq ('KProxy :: KProxy *)
或者只是使用它:
import Data.Singletons.TypeRepStar()