为什么编译器无法将类型 'a==a' 与类型族的“True”匹配?

Why compiler couldn't match type 'a==a' with '`True' for type family?

是否有某些原因导致此代码未编译:

type family Foo a b :: Bool where
    Foo a b = a == b

foo :: Foo a b ~ True => Proxy a -> Proxy b
foo _ = Proxy

bar :: Proxy a -> Proxy a
bar = foo

有错误:

Couldn't match type ‘a == a’ with ‘'True’
Expected type: 'True
  Actual type: Foo a a

但是如果我将类型族定义更改为

type family Foo a b :: Bool where
    Foo a a = True
    Foo a b = False

编译的好吗?

(ghc-7.10.3)

由于 Daniel Wagner 要求提供完整的工作示例,我找到了答案。

首先完成示例:

{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE TypeOperators #-}
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE UndecidableInstances #-}
{-# LANGUAGE PolyKinds #-}
module Test where

import Data.Type.Equality(type (==))
import Data.Proxy(Proxy(..))

type family Foo a b :: Bool where
    Foo a b = a == b

foo :: Foo a b ~ True => Proxy a -> Proxy b
foo _ = Proxy

bar :: Proxy a -> Proxy a
bar = foo

这里的问题是 PolyKinds 杂注。没有它它运作良好。 我可能需要它以便我可以写

bar :: Proxy (a :: *) -> Proxy a

一切顺利。

现在原因很清楚了。类型族 (==) 没有多类实例(详细解释了为什么不提供此类实例 here),因此我们无法减少所有等式。所以我们需要指定一个种类。