2014-09-26 54 views
0

我試圖定義一個函數,它需要一個[[Char]]類型的圖片並複製每個元素。但是,它需要將該複製的新圖像複製並垂直添加。我能夠使用「複製」並複製每個元素兩次,但我不確定如何複製新圖像。我所做的只是追加了兩次複製,但只是「附加」水平,而不是垂直。這裏是我的代碼:如何複製列表並將其垂直追加到Haskell中

type Picture = [[Char]] 

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

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

main = do 
    print(replicating picture) 

最後,我想實現這個形象:

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

到目前爲止,我只有這個:

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

感謝。

+0

看起來你只是在你的兩個'concatMap'之間缺少一個換行''\ n「' – luqui 2014-09-26 00:53:30

+1

你需要一個'\ n'字符。或者你製作一個行列表並使用'unlines'函數。 – Mephy 2014-09-26 00:53:54

+0

那麼我應該在哪裏放置「\ n」? – 2014-09-26 01:01:19

回答

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%清楚,我從質疑,認爲你正在尋找的輸出是一個String ,但如果是這樣,那麼您需要額外的concat來轉換類型[String]->String

一旦完成,你重複它,最後,intercalate行爲有點像concat,但可以讓你插入每個字符串之間的東西(在這種情況下是其他人提到的'\ n'註釋)。


由於@Bheklilr在評論中提到的,intercalate "\n"可以簡化爲unlines ....如果你需要字裏行間別的東西,使用intercalate,否則unlines乾淨多了。

+0

爲什麼不'unlines'? – bheklilr 2014-09-26 01:48:07

+0

@ bheklilr-好點,(基本上是'unlines = intercalate「\ n」',我想我應該在上面提及)....我傾向於使用插入很多,因爲我經常有其他東西(比如逗號在每行的末尾,或者在第一行後面有空格縮進),但在這裏似乎不是這種情況,所以我會在答案中添加註釋。 – jamshidh 2014-09-26 01:56:27

+0

我正在尋找的輸出是圖片類型(複製菌素的返回)。圖片是[[Char]]。現在我確實知道你在說什麼,但我不確定它是如何工作的。我試過這個:複製::圖片 - >圖片 複製pic =插入「\ n」(concatMap(replicate 2)++ concatMap(replicate 2)pic)。它不起作用。你能給我一個更具體的代碼請 – 2014-09-26 02:07:59

相關問題