您好我正在尝试使用列表理解来实现一个简单的函数:
@perfil.perfil_access.pluck(:id)
这就是我想出来的
duplicate "asdf" = "assdff"
duplicate "123456" = "122344566"
我想让我作为一个计数器来跟踪列表的位置,而x则用来保存列表。
有没有办法让这项工作?
答案 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)]