4

作为学习 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
4

4 回答 4

14

你的问题是你的基本情况。这里:

init' [x] = [x]

你是说当你进入一个包含一个元素的列表时,你想要返回相同的列表。这不是预期的结果。当你有一个只有一个元素的列表时,你想返回一个空列表(除了最后一个元素之外的所有元素都是一个空列表)。

init' [x] = []

在旁注中,您可能应该将其声明为

init' :: [a] -> [a]

使用 'a' 作为类型将其推广到任何列表,而不仅仅是 Ints。这样你就可以在任何类型的列表上调用 init'。例如 init' "abcde" 会给你 "abcd"

于 2010-02-12T00:42:08.963 回答
4

您的第二条规则应该是:

init' [x] = []

当一个列表只有一个元素时,它就是最后一个,所以没有最后一个元素的列表就是空列表。

于 2010-02-12T00:41:50.443 回答
3
init' [x] = [x]

这是不正确的。如果删除单元素列表的最后一个元素,则不会返回相同的列表,而是返回一个空列表。

于 2010-02-12T00:41:54.423 回答
-1

这是我的版本试试这个。

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
于 2011-12-24T09:43:00.243 回答