Haskell 为什么编译器不能';t匹配类型';a==a';与'`正确';类型家庭?
这段代码没有编译有什么原因吗Haskell 为什么编译器不能';t匹配类型';a==a';与'`正确';类型家庭?,haskell,type-families,data-kinds,Haskell,Type Families,Data Kinds,这段代码没有编译有什么原因吗 键入family Foo a b::Bool where Foo a b=a==b foo::foo a b~True=>Proxy a->Proxy b foo=代理 bar::Proxy a->Proxy a bar=foo 有误: Couldn't match type ‘a == a’ with ‘'True’ Expected type: 'True Actual type: Foo a a 但如果我将类型族定义更改为 键入family Foo a
键入family Foo a b::Bool where
Foo a b=a==b
foo::foo a b~True=>Proxy a->Proxy b
foo=代理
bar::Proxy a->Proxy a
bar=foo
有误:
Couldn't match type ‘a == a’ with ‘'True’
Expected type: 'True
Actual type: Foo a a
但如果我将类型族定义更改为
键入family Foo a b::Bool where
Foo a=真
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
这里的问题在于polytypes
pragma。没有它,它工作得很好。
我可能需要它,这样我才能写作
bar :: Proxy (a :: *) -> Proxy a
一切都很顺利
原因现在已经很清楚了。类型族(
==
)没有多类实例(详细说明为什么不提供此类实例),因此我们无法减少所有等式。所以我们需要指定一种类型。类型族==
在哪里定义?GHC是否自动从实例中提取?如果是这样的话,GHC必须考虑一个奇怪的实例的可能性,我想在一些自定义类型上(==)=\\\\\\\\\\\\\\\\->False
。你能提供一个完整的工作示例吗?当我尝试你的例子时,我得到的错误与你显示的不同。@chi,或者不奇怪:(让x=0/0 in x==x)~>False
@haoformayor当引用外部来源的内容时,你应该使用块引号,以便清楚引用了什么。在这种特殊情况下,格式很糟糕,需要进行一些处理。此外,您在中编辑的内容对于回答问题不是必需的,因此不需要实际复制它。如果没有它,答案已经完整,没有提供多类实例的“为什么”可以在其他问题中回答,也可以留作进一步阅读的链接。您的==
类型系列的实用程序是什么?使用本机类型相等(~
)通常比在类型系统中构建布尔相等容易得多。在一天结束时,你必须使用~
来处理=
的结果,就像你在foo
@BenjaminHodgson中所做的那样:=
不是我的。它来自base
包。这是一个类型族,其结果为kindBool
。另一方面,~
的结果具有种类约束
。因此,==
可用于布尔类型的级别计算。你不能在那里使用~
。我的问题是你为什么要使用布尔等式而不是?@BenjaminHodgson命题等式(:~:
)是一种类型为*
的数据类型。我看不出如何在类型计算中使用它来代替类型family=
。关于所有这些平等性的问题似乎太常见了,无法评论。也许最好分开问?