为什么 ["",_] 与 ("":_) 不同?

Far*_*exx 1 haskell pattern-matching

我偶然发现了一个令我非常困惑的错误。我有一个带有模式匹配的递归函数,["",_] = []但它根本不起作用。经过多次尝试找出我的错误后,我尝试将其与("":_) = []. 它成功了!我只是想知道为什么第一个术语不起作用但第二个术语起作用。该函数起作用并调用模式匹配:

takeAllElem :: [String] -> [String]
takeAllElem ("":_) = []
takeAllElem (xs) =  map takeFirstElem (xs) :  (takeAllElem (removeFirstElem (xs)))
Run Code Online (Sandbox Code Playgroud)

这个函数也可以工作,但是模式匹配永远不会被调用:

takeAllElem :: [String] -> [String]
takeAllElem ["",_] = []
takeAllElem (xs) =  map takeFirstElem (xs) :  (takeAllElem (removeFirstElem (xs)))
Run Code Online (Sandbox Code Playgroud)

这只是一个语法错误还是编译器的解释["",_]("":_).

che*_*ner 8

["", _]是一个恰好包含两个元素的列表,相当于"":_:[].

("":_)是任何非空列表,其第一个元素是空字符串。尾部是任意列表。