我有字符串列表
["1", "2", "3", "4", "5"]
我写了第一个函数,但它没有工作
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"]
答案 0 :(得分:2)
而不是(:)
,您需要使用(++)
head_to_end x = tail x ++ [head x]
请记住,(:)
的类型为a->[a]->[a]
....您需要左侧的单个元素和右侧的列表。你的类型正好相反。
另请注意,将头部移动到这样的列表尾部是一项昂贵的操作,代码必须重建完整列表。
答案 1 :(得分:0)
您可以使用模式匹配分别访问列表的头部和尾部,然后使用++
运算符将头部(作为单个列表)附加到列表尾部的末尾。
headToEnd :: [a] -> [a]
headToEnd [] = []
headToEnd (x:xs) = xs ++ [x]
要将列表的最后一个元素移到开头,我们不能使用模式匹配,但我们可以使用last
和init
函数(默认情况下导入Prelude
)在Data.List
模块(来自基础库)中访问这些值。您可以使用cons运算符(:)
来构建包含last
和init
值的新列表。
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”,这是第一个结果。