Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Haskell 为什么编译器不能';t匹配类型';a==a';与'`正确';类型家庭?_Haskell_Type Families_Data Kinds - Fatal编程技术网

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
包。这是一个类型族,其结果为kind
Bool
。另一方面,
~
的结果具有种类
约束
。因此,
==
可用于布尔类型的级别计算。你不能在那里使用
~
。我的问题是你为什么要使用布尔等式而不是?@BenjaminHodgson命题等式(
:~:
)是一种类型为
*
的数据类型。我看不出如何在类型计算中使用它来代替类型family
=
。关于所有这些平等性的问题似乎太常见了,无法评论。也许最好分开问?