我需要创建一个采用字符串第一个元素的函数,但因为我在其他函数中递归地使用此函数,所以我需要为空列表声明边缘情况。如果给定一个空列表,这个函数怎么能不执行任何操作呢?
takeFirstElem :: String -> Char
takeFirstElem [] = {- missing Element -}
takeFirstElem (x:xs) = x
Run Code Online (Sandbox Code Playgroud)
我缺少的是类似于 null 元素的东西(比如空 List [] 中的 nil 元素)。是否存在这样的事情或者是否有其他方法来解决这个问题?
我偶然发现了一个令我非常困惑的错误。我有一个带有模式匹配的递归函数,["",_] = []但它根本不起作用。经过多次尝试找出我的错误后,我尝试将其与("":_) = []. 它成功了!我只是想知道为什么第一个术语不起作用但第二个术语起作用。该函数起作用并调用模式匹配:
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)
这只是一个语法错误还是编译器的解释["",_]与("":_).