为什么我不能编写一般函数来检查两个列表是否相等?

pt2*_*121 11 haskell

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

f :: [Int] -> Bool
f l  
    | l==l = True
    | otherwise = False
Run Code Online (Sandbox Code Playgroud)

但我不能这样做.

f :: [a] -> Bool
f l  
    | l==l = True
    | otherwise = False
Run Code Online (Sandbox Code Playgroud)

引擎盖下发生了什么?

Tik*_*vis 23

给定两个任意类型的值,Haskell不一定知道如何比较它们的相等性.==仅针对属于Eq该类的类型定义.

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

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

f :: Eq a => [a] -> Bool
Run Code Online (Sandbox Code Playgroud)

  • 如果你认为函数是相等的,如果它们为所有输入产生相同的结果,并允许包含非终止作为可能的结果,那么函数相等会减少到停止问题.所以是的,不可判定的. (11认同)
  • 减少停止问题的东西本身并不会使它变得不可判定.停止问题减少到某些东西确实使它不可判定. (6认同)