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