Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/10.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/extjs/3.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 为什么可以';我是否可以编写一个通用函数来检查两个列表是否相等?_Haskell - Fatal编程技术网

Haskell 为什么可以';我是否可以编写一个通用函数来检查两个列表是否相等?

Haskell 为什么可以';我是否可以编写一个通用函数来检查两个列表是否相等?,haskell,Haskell,我正在学习Haskell,我不明白为什么我可以这样做: f :: [Int] -> Bool f l | l==l = True | otherwise = False 但我不能这么做 f :: [a] -> Bool f l | l==l = True | otherwise = False 引擎盖下面发生了什么?给定任意类型的两个值,Haskell不一定知道如何比较它们是否相等=仅为属于Eq类的类型定义 例如,确定两个函数是否相等通常是

我正在学习Haskell,我不明白为什么我可以这样做:

f :: [Int] -> Bool
f l  
    | l==l = True
    | otherwise = False
但我不能这么做

f :: [a] -> Bool
f l  
    | l==l = True
    | otherwise = False
引擎盖下面发生了什么?

给定任意类型的两个值,Haskell不一定知道如何比较它们是否相等<代码>=仅为属于
Eq
类的类型定义

例如,确定两个函数是否相等通常是不可判定的(我认为)

通过检查每个元素是否等于另一个列表中对应的元素,可以比较两个列表。但是,只有在可以比较元素是否相等时,这才有意义,因此必须添加约束:

f :: Eq a => [a] -> Bool

我会告诉你关于现实世界中类型类的章节Haskell


对此我不是100%肯定,但可能是因为对象类型。Eq类有Char、Int、Float、Double等,但若你们有像House这样的对象,除非你们定义它,否则它不知道如何比较它们。希望这能有所帮助。实际上,它似乎可以归结为Eq类,Eq类仅为这些类型定义了
=
。@Matt:在Haskell中,没有称为对象类型或对象的概念。无论如何,我对细节感到困惑。它不应该有两个参数(
[a]->[a]->Bool
)吗?
l==l
是否总是正确的(对于任何
Eq
)?@AndrewJaffe它取决于
Eq
实例。的确,对于所有自动生成的Eq实例,
l==l
都有效,但从技术上讲,没有什么可以阻止您编写以下实例:
instance Eq T,其中{{u==False}
@jmg:从技术上讲,没有什么可以阻止这一点。也没有什么可以阻止你设计一个违反monad法则的monad。但是,你绝对不应该做这样的事情,任何人都应该能够依赖这些定律,=代码>应该始终是一个等价关系。如果你认为函数是相等的,如果它们对所有的输入产生相同的结果,并且允许包含非终止作为一个可能的结果,然后函数相等就归结为停止问题。所以,是的,不可判定。某些减少到停顿问题本身并不能使它不可判定。停下来的问题归结到某件事上确实使它无法确定。@Prateek:是的,对不起。我说错了。无论如何,在这种情况下,两者都可以简化为另一种。