Haskell列表理解使用不同的变量

时间:2016-04-08 05:57:54

标签: haskell list-comprehension

您好我正在尝试使用列表理解来实现一个简单的函数:

@perfil.perfil_access.pluck(:id)

这就是我想出来的

duplicate "asdf" = "assdff"

duplicate "123456" = "122344566"

我想让我作为一个计数器来跟踪列表的位置,而x则用来保存列表。

有没有办法让这项工作?

2 个答案:

答案 0 :(得分:4)

您的else分支无法在您的函数中生成列表 - 您可以轻松修复如下语法问题:

duplicate xs = 
   [ y | x <- xs
       , i <- [0..]
       , y <- if i `mod` 2 == 0 
              then replicate 2 x 
              else [x] ]

但是这只会给你xs中的第一件事的无穷无尽的列表(因为有无数的i s)

现在我的猜测是你确实想要复制其他所有元素2次,是zip是个好主意,你几乎就在那里(带有你的评论):

只需确保您在那里修复语法 / 类型错误:

duplicate xs = 
   [ y | (i, x) <- zip [0..] xs
       , y <- if i `mod` 2 == 0 
              then replicate 2 x 
              else [x] ]

这会给你:

λ> duplicate "Hello" 
"HHellloo"

希望你正在寻找什么

锻炼

您可以将其重写为

duplicate = concat . zipWith replicate (cycle [2, 1])

尝试了解其工作原理

提示它基于以下想法:取第一个中的2个,然后是第二个中的1个,然后是第三个中的2个,然后是第四个中的1个,...... - 只有Haskells高阶函数和运算符动物园模糊;)

答案 1 :(得分:3)

您可以使用zip来提供包含索引的项目:

Prelude> zip "asdf" [0..]
[('a',0),('s',1),('d',2),('f',3)]