首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >doSkip函数

doSkip函数
EN

Code Review用户
提问于 2014-09-24 00:37:20
回答 1查看 47关注 0票数 1

我写了一个函数,doSkip

对于N大小的列表,索引0处的元素由整个输入组成.索引1包含所有其他元素,即奇数元素。然后,索引2到N由输入的各个索引组成。

代码语言:javascript
复制
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 

测试

代码语言:javascript
复制
ghci> doSkip"FOOBAR"
["FOOBAR","OBR","O","B","A","R"]
ghci> doSkip"bippy"
["bippy","ip","p","p","y"]

请评论一下。我想它有点长,但我不知道如何缩短它。

EN

回答 1

Code Review用户

发布于 2014-09-24 01:11:56

首先,这肯定是我见过的最利基的功能之一:)有一个真正的用例吗?这是作业吗?

前缀do似乎很奇怪。您显然不能称它为skip,函数的定义对我来说太奇怪了,我现在想不出另一个名称了,但我建议您认真考虑这个名称。

我建议安装hlint。它将为您提供保持代码整洁和使用标准函数的建议。例如,

地图((_,y) -> y)

就是map snd

rest [] = [] rest (y: ys ) = 是:rest ys

可以编写为rest = map (: [])

至于实际的代码,让我们把它分解。首先,我们需要整个输入:

代码语言:javascript
复制
doSkip xs = xs : ???

现在我们想要所有其他元素

代码语言:javascript
复制
doSkip xs = xs : everyOther xs : ???

那我们就需要元素2..。

代码语言:javascript
复制
doSkip xs = xs : everyOther xs : [ [x] | x <- drop 2 xs ]

太好了,剩下的就是我们对everyOther的定义了

代码语言:javascript
复制
everyOther (x:y:xs) = y : everyOther xs
everyOther _ = []

最后是基本的案子,就像你有他们一样

代码语言:javascript
复制
doSkip [] = []
doSkip [x] = [[x]]
doSkip xs = xs : everyOther xs : [ [x] | x <- drop 2 xs ]
票数 4
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/63732

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档