2

我正在尝试使用列表推导来实现一个函数,该函数根据指定的次数复制元素。我真的坚持这一点,但我正在努力

例如

copy 2 'a' = aa

这是我到目前为止所拥有的:

copy2 :: Int->a->[a]
copy2 x y = func1 y [b|b<-[1..x]]

其中 func1 以某种方式将 y 映射到 x 的每个元素

这不是很多,但我真的对这个对不起伙计们一无所知。

4

2 回答 2

7

即使答案已被接受,我想指出您在问题中说了一些非常重要的内容,这可能会导致您得到答案。

你说:

copy2 :: Int->a->[a]
copy2 x y = func1 y [b|b<-[1..x]]

其中 func1 以某种方式将 y 映射到 x 的每个元素

如果我们稍微清理一下措辞——我相信这就是你的意思——我们实际上想要的东西是由对ant 值map的理解产生的列表的每个元素。consty

好吧,制作一个为单个 x 生成值 y 的函数很简单:

const y x = y

事实上,这个功能已经足够有用了,它已经存在于 Prelude 中了!

现在我们只需要map遍历列表的每个元素。

copy2 x y = map (const y) [b | b <- [1..x]]

或者稍微简化一下,以真正展示我们与您的原始描述有多接近,(即使我知道您需要列表理解)

copy2 x y = map (\x -> y) [1..x]

“为每个 x 将 x 映射到 y。”

所以你看,你一直都有。

于 2013-10-18T23:22:11.967 回答
4
copy2 qty item = [item|_<-[1..qty]]
于 2013-10-18T22:06:27.323 回答