我写了一个函数,doSkip。
对于N大小的列表,索引0处的元素由整个输入组成.索引1包含所有其他元素,即奇数元素。然后,索引2到N由输入的各个索引组成。
doSkip :: [a] -> [[a]]
doSkip [] = []
doSkip [x] = [[x]]
doSkip xxs@(_:_:[]) = [xxs]
doSkip xxs@(_:_:xs) = xxs : everyOther : (rest xs)
where everyOther = (map (\(_, y) -> y) . filter (\(x, _) -> odd x) . zip [0..]) xxs
rest [] = []
rest (y:ys) = [y] : rest ys ghci> doSkip"FOOBAR"
["FOOBAR","OBR","O","B","A","R"]
ghci> doSkip"bippy"
["bippy","ip","p","p","y"]请评论一下。我想它有点长,但我不知道如何缩短它。
发布于 2014-09-24 01:11:56
首先,这肯定是我见过的最利基的功能之一:)有一个真正的用例吗?这是作业吗?
前缀do似乎很奇怪。您显然不能称它为skip,函数的定义对我来说太奇怪了,我现在想不出另一个名称了,但我建议您认真考虑这个名称。
我建议安装hlint。它将为您提供保持代码整洁和使用标准函数的建议。例如,
地图((_,y) -> y)
就是map snd。
rest [] = [] rest (y: ys ) = 是:rest ys
可以编写为rest = map (: [])。
至于实际的代码,让我们把它分解。首先,我们需要整个输入:
doSkip xs = xs : ???现在我们想要所有其他元素
doSkip xs = xs : everyOther xs : ???那我们就需要元素2..。
doSkip xs = xs : everyOther xs : [ [x] | x <- drop 2 xs ]太好了,剩下的就是我们对everyOther的定义了
everyOther (x:y:xs) = y : everyOther xs
everyOther _ = []最后是基本的案子,就像你有他们一样
doSkip [] = []
doSkip [x] = [[x]]
doSkip xs = xs : everyOther xs : [ [x] | x <- drop 2 xs ]https://codereview.stackexchange.com/questions/63732
复制相似问题