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

问题描述:

作为学习Haskell的一部分,我试图实现我自己版本的与列表相关的各种函数。现在我卡在init函数。 Haskell中的init函数返回List中除最后一个元素之外的所有元素。学习Haskell:如何实现我自己的init函数版本

这是我到目前为止所做的。

init' :: [Int] -> [Int] 
init' [] = error "This function cannot be applied to an empty list" 
init' [x] = [x] 
init' (x:xs) = x : init' xs 
+0

这功课吗? – 2010-02-12 00:40:40

+3

'safeInit = foldr((。)Just。maybe []。(:))Nothing' ;-) – ephemient 2010-02-15 04:14:25

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

init' [x] = [x] 

你是说,当你回到一个列表中有一个元素,你想要返回相同的列表。这不是理想的结果。当你只有一个元素的列表时,你想返回一个空列表(除了单个元素的最后一个元素是一个空列表)。

init' [x] = [] 

在一个侧面说明,你应该把它声明为

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

使用“A”作为类型它推广到任何东西名单,而不仅仅是个整数。这样你可以在任何列表上调用init'。例如init'“abcde”会给你“abcd”

+0

谢谢......修正了它。 – 2010-02-12 00:48:57

你的第二个规则应该是:

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