作为学习 Haskell 的一部分,我正在尝试实现我自己版本的与列表相关的各种功能。现在我被困在init函数上。Haskell 中的 init 函数返回 List 中除最后一个元素之外的所有元素。
这是我到目前为止所做的。
init' :: [Int] -> [Int]
init' [] = error "This function cannot be applied to an empty list"
init' [x] = [x]
init' (x:xs) = x : init' xs
你的问题是你的基本情况。这里:
init' [x] = [x]
你是说当你进入一个包含一个元素的列表时,你想要返回相同的列表。这不是预期的结果。当你有一个只有一个元素的列表时,你想返回一个空列表(除了最后一个元素之外的所有元素都是一个空列表)。
init' [x] = []
在旁注中,您可能应该将其声明为
init' :: [a] -> [a]
使用 'a' 作为类型将其推广到任何列表,而不仅仅是 Ints。这样你就可以在任何类型的列表上调用 init'。例如 init' "abcde" 会给你 "abcd"
您的第二条规则应该是:
init' [x] = []
当一个列表只有一个元素时,它就是最后一个,所以没有最后一个元素的列表就是空列表。
init' [x] = [x]
这是不正确的。如果删除单元素列表的最后一个元素,则不会返回相同的列表,而是返回一个空列表。
这是我的版本试试这个。
init' :: [a] -> [a]
init' [] = error("This is not right, empty list is not allowed here")
init' (x:[]) = [x]
init' (x:xs:[]) = [x]
init' (x:xs) = x: init' xs