簡體   English   中英

Haskell:如何分別從列表中獲取每個數字?

[英]Haskell: how can I take each number from a list separately?

我正在嘗試將“-”字符復制 0 到 n 次,添加一個“*”並再次添加一個“-”字符的副本,遞歸地重復 n 到 0 次,例如:如果 n = 5,我'我希望答案是:

*-----

-*----

--*---

---*--

----*-

-----*




duplicate :: String -> Int -> String -- will be used to duplicate spaces
duplicate string n = 
    concat $ replicate n string

block :: Int -> String
block n =
    duplicate ***from 0 to n*** "-" ++ '*' ++ duplicate ***from n to 0*** "-"

我怎樣才能做到這一點?

最簡單的方法是創建一個打印一行的函數:

line width idx = duplicate "-" idx ++ "*" ++ duplicate "-" (width - idx - 1) ++ "\n"

然后將其映射到列表[0..(n-1)] ,然后連接結果:

block n = concat $ map (line n) [0..(n-1)]

或者,為了獲得更直觀的解決方案,您可以執行與列表理解相同的操作:

block n = concat
    [ duplicate "-" i ++ "*" ++ duplicate "-" (n - i - 1) ++ "\n"
    | i <- [0..(n-1)]
    ]

處理這項工作的簡單代碼可能是;

\n -> (drop <> take) <$> [n+1,n..1] <*> ['*':replicate n '-']

我在我之前的回答中解釋了drop <> take :: Int -> [a] -> [a] fmap ( <$> ) 和 applicative op ( <*> ) 應該是清楚的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM