学习Haskell:如何实现我自己的init函数版本

时间:2010-02-12 00:35:21

标签: haskell init

作为学习Haskell的一部分,我正在尝试实现与Lists相关的各种函数的自己版本。现在我被困在 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 个答案:

答案 0 :(得分:12)

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

init' [x] = [x]

你说当你到达一个包含一个元素的列表时,你想要返回相同的列表。这不是理想的结果。如果列表中只包含一个元素,则需要返回一个空列表(除了单个项目的最后一个元素之外的所有元素都是空列表)。

init' [x] = []

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

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

使用'a'作为类型将其概括为任何内容的列表,而不仅仅是Ints。这样你就可以在任何类型的列表上调用init'。例如,init'“abcde”会给你“abcd”

答案 1 :(得分:4)

你的第二条规则应该是:

init' [x] = []

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

答案 2 :(得分:3)

init' [x] = [x]

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

答案 3 :(得分:0)

这是我的版本试试这个。

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