2015-11-09 31 views
-4

我們已經接受了一個練習,我們必須用用戶輸入的字符「框住」一個字符串。例如:如何在字符串周圍包裝字符?

******* 
* AAA * 
*A A* 
*AAAAA* 
*A A* 
*A A* 
******* 

我已經定義字符串來表示從性格特徵的字母轉換爲字符串,並且也是一個函數來操縱它的大小,簡單地說爲「拉伸」。我試圖首先用星號包圍這些字符串,並嘗試獲取輸出,如上例所示,但我一直收到類型錯誤。我現在能夠在終端中逐行執行(如下所示),因爲我將在之前展示過,但沒有將它實現成函數(也在下面)......任何建議?

在解釋一行行代碼:

EX01> map(\x-> "*" ++ x ++ "*")(letter 'a') 
["* AAA *","*A A*","*AAAAA*","*A A*","*A A*"] 
EX01> top_and_bottom $$ 
["*******","* AAA *","*A A*","*AAAAA*","*A A*","*A 
A*","*******"] 
EX01> map(\x-> x ++ "\n") $$ 
["*******\n","* AAA *\n","*A A*\n","*AAAAA*\n","*A A*\n","*A >A*\n","*******\n"] 
EX01> concat $$ 
"*******\n* AAA *\n*A A*\n*AAAAA*\n*A A*\n*A A*\n*******\n" 
EX01> putStr$$ 
******* 
* AAA * 
*A A* 
*AAAAA* 
*A A* 
*A A* 
******* 

我在實施它變成一個功能的嘗試:

stars :: Int -> String 
stars 0 = ""    
stars n = '*':(stars (n-1)) 

top_and_bottom :: [String] -> [String] 
top_and_bottom x = (fringe : x) ++ [fringe] 
    where 
    fringe = (stars (length (head x))) 

framestar :: [String] -> [String] 
framestar x = putStr(concat(top_and_bottom(map(\x -> "*" ++ x ++ "*")[x]))) 

(PS:我怎麼也這樣做,所以它可能需要的任何字符?)

+0

相關用戶名? – d0nut

+0

儘量放鬆一點。我只是在發表輕鬆的評論。 – d0nut

+0

如果有其他人想知道,解釋器演示中的'$$'不是語法錯誤,但[擁抱技巧來恢復最後的結果](https://www.haskell.org/hugs/pages/hugsman/ started.html)。 – duplode

回答

3

我建議你解決一個更簡單更通用的問題,並考慮如何在你的情況下使用它

wrap :: a -> [a] -> [a] 
wrap x xs = x:xs++[x] 

現在,您可以將其應用於您的問題,其中xs是一行,x = *。其次,你可以認爲你的xs是行和x =「*****」(使用正確的長度)。如果您知道並允許使用map,則可以對每行使用換行,然後對結果進行一次換行。這將是一個班輪。

+0

解決!謝謝 :) – iAmNotAComputerScientistYet

相關問題