如何复制列表列表并在Haskell中垂直附加它们

时间:2014-09-26 00:50:02

标签: haskell

我正在尝试定义一个函数,它接受[[Char]]类型的图片并复制每个元素。但是,它需要采用复制的新图像并复制它并垂直附加它。我可以使用“复制”并复制每个元素两次,但我不确定如何复制新图像。我做的是我只是附加了两次复制,但只是水平地“追加”,而不是垂直。这是我的代码:

type Picture = [[Char]]

picture::Picture 
picture = ["#", ".", "#"]

replicating::Picture->Picture
replicating pic = concatMap (replicate 2) pic ++ concatMap (replicate 2) pic

main = do
    print(replicating picture)

最终我想要实现这个形象:

##..##
##..##

到目前为止,我只有这个:

##..####..##

感谢。

1 个答案:

答案 0 :(得分:0)

这对你有用吗?

import Data.List

type Picture = [[Char]]

picture::Picture 
picture = ["#", ".", "#"]

replicating::Picture->String
replicating pic = intercalate "\n" $ replicate 2 $ 
                           concat $ concatMap (replicate 2) pic

然后您可以调用并显示main的输出,如下所示 -

main = do 
    putStrLn (replicating picture)

对于我来说,您正在寻找的输出是一个字符串是不是100%清楚,但如果是这样,您需要额外的concat来转换类型[String]->String

一旦完成,你复制它,最后,intercalate行为有点像concat,但是让你在每个被连接的字符串之间插入一些东西(在这种情况下是'\' n'其他人在评论中提到。)


正如@Bheklilr在评论中提到的那样,intercalate "\n"可以简化为unlines ....如果您在行之间需要其他内容,请使用intercalate,否则{{1}更清洁。