首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >任意长度和基的所有数的生成

任意长度和基的所有数的生成
EN

Code Review用户
提问于 2014-11-28 03:38:43
回答 1查看 94关注 0票数 1

quux (['0'..9'] ++ ['A'..F']) 2生成长度为2的十六进制数(带有前导零),但显然可以生成任何基和任意长度。

代码语言:javascript
复制
quux digits length = iterate foo return !! length $ [] where  
    foo bb aa = map (: aa) digits >>= bb

这段代码是否可以简化,同时保留在列表中迭代的想法呢?

EN

回答 1

Code Review用户

回答已采纳

发布于 2014-11-28 18:40:49

事实证明,这正是replicateM[] monad中所做的。为了完整起见,让我们来看看replicateM到底是如何工作的。

代码语言:javascript
复制
replicateM :: Monad m => Int -> m a -> m [a]
replicateM n x = sequence (replicate n x)

replicate :: Int -> a -> [a]
replicate n x = [ x | _ <- [1..n] ]

replicateM原来只是把繁重的工作交给了replicatesequencereplicate非常简单,因此有趣的部分依次发生:

代码语言:javascript
复制
sequence :: Monad m => [m a] -> m [a]
sequence [] = return []
sequence (x:xs) = do
    x'  <- x
    xs' <- sequence xs
    return (x' : xs')

事实上,这正是依赖于[] monad实例进行迭代的原因。几个绑定和一个返回。

票数 2
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

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

复制
相关文章

相似问题

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