2016-03-06 24 views
0

我有一个字符串头结束列表和背部移动ELEM索引

我写的第一功能的列表,但它不工作

head_to_end :: [String] -> [String] 
head_to_end x = t : h 
    where h = `head` x 
      t = `tail` x 

我应该得到的东西这样

head_to_end ["1", "2", "3", "4", "5"] -> ["2", "3", "4", "5", "1"] 
last_to_head ["1", "2", "3", "4", "5"] -> ["5", "1", "2", "3", "4"] 

move_elem_1_to_4 :: Int -> Int -> [String] -> [String] 
move_elem_1_to_4 ["a", "b", "c", "d", "e"] -> ["b", "c", "d", "a", "e"] 

回答

2

相反的(:),则需要使用头移动到结束(++)

head_to_end x = tail x ++ [head x] 

记住,(:)a->[a]->[a]型的....你将需要在左侧的单个元素,并在右边的列表。你的类型是相反的。

另请注意,将头移动到这样的列表的尾部是一个昂贵的操作,代码将不得不重建完整列表。

0

您可以使用模式匹配分别访问列表的头部和尾部,然后使用++运算符将头部(作为单例列表)附加到列表末尾。

headToEnd :: [a] -> [a] 
headToEnd []  = [] 
headToEnd (x:xs) = xs ++ [x] 

到列表的最后一个元素移动到开始,我们不能使用模式匹配,但我们可以在Data.List模块中使用lastinit功能(与Prelude默认导入)(从基库)来访问这些值。在这里,您将使用cons运算符(:)构建新列表,其值为lastinit

lastToHead :: [a] -> [a] 
lastToHead [] = [] 
lastToHead xs = last xs : init xs 

查一查每个运营商(:)(++)在GHCI的类型。它很清楚为什么你的例子不起作用。

λ :t (++) 
(++) :: [a] -> [a] -> [a] 
λ :t (:) 
(:) :: a -> [a] -> [a] 

下面是在我刚才提到的功能和运营商信息上Data.List参考。我自己通过访问Hoogle,然后搜索“Data.List”,然后点击“base Data.List”,这是第一个结果。

+0

虽然此代码片段可能会解决问题,但[包括解释](http://meta.stackexchange.com/questions/114762/explaining-entirely-code-based-answers)确实有助于提高您的质量帖子。请记住,您将来会为读者回答问题,而这些人可能不知道您的代码建议的原因。也请尽量不要用解释性注释来挤占代码,这会降低代码和解释的可读性! – SmokeDispenser

+0

@SmokeDispenser谢谢你指出。解释补充说。 – veidt