Haskell 为什么可以';我是否可以编写一个通用函数来检查两个列表是否相等?
我正在学习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类的类型定义 例如,确定两个函数是否相等通常是
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。但是,你绝对不应该做这样的事情,任何人都应该能够依赖这些定律,