我們已經接受了一個練習,我們必須用用戶輸入的字符「框住」一個字符串。例如:如何在字符串周圍包裝字符?
*******
* 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:我怎麼也這樣做,所以它可能需要的任何字符?)
相關用戶名? – d0nut
儘量放鬆一點。我只是在發表輕鬆的評論。 – d0nut
如果有其他人想知道,解釋器演示中的'$$'不是語法錯誤,但[擁抱技巧來恢復最後的結果](https://www.haskell.org/hugs/pages/hugsman/ started.html)。 – duplode