2010-02-12 60 views
3

作爲學習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

回答

12

你的問題是你的基本情況。這裏:

init' [x] = [x] 

你是說,當你回到一個列表中有一個元素,你想要返回相同的列表。這不是理想的結果。當你只有一個元素的列表時,你想返回一個空列表(除了單個元素的最後一個元素是一個空列表)。

init' [x] = [] 

在一個側面說明,你應該把它聲明爲

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

使用「A」作爲類型它推廣到任何東西名單,而不僅僅是個整數。這樣你可以在任何列表上調用init'。例如init'「abcde」會給你「abcd」

+0

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

4

你的第二個規則應該是:

init' [x] = [] 

當列表只有一個元素,那麼它是最後一個,所以沒有最後一個元素的名單只是空列表。

3
init' [x] = [x] 

這是不正確的。如果刪除單元素列表的最後一個元素,則不會返回相同的列表,而是返回空列表。

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