![](/img/trans.png)
[英]How can I take a fractional number and convert it to a list of its digits in 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.