学习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
答
你的问题是你的基本情况。这里:
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
这功课吗? – 2010-02-12 00:40:40
'safeInit = foldr((。)Just。maybe []。(:))Nothing' ;-) – ephemient 2010-02-15 04:14:25