[英]Haskell if else list comprehension
我正試圖以正確的方式打印出一塊電路板,如下所示:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
1. . . . . . . . . . . . . . . . . .
2. . . . . . . . . . . . . . . . . .
3. . . . . . . . . . . . . . . . . .
4. . . . . . . . . . . . . . . . . .
5. . . . . . . . . . . . . . . . . .
6. . . . . . . . . . . . . . . . . .
7. . . . . . . . . . . . . . . . . .
8. . . . . . . . . . . . . . . . . .
9. . . . . . . . . . . . . . . . . .
10. . . . . . . . . . . . . . . . . .
11. . . . . . . . . . . . . . . . . .
12. . . . . . . . . . . . . . . . . .
13. . . . . . . . . . . . . . . . . .
14. . . . . . . . . . . . . . . . . .
15. . . . . . . . . . . . . . . . . .
16. . . . . . . . . . . . . . . . . .
17. . . . . . . . . . . . . . . . . .
18. . . . . . . . . . . . . . . . . .
我在這里有列表理解
((concat [(""++show i)++" " | i <- [1..n], i<10])++"\n")
我可以正確地得到9個第一個數字,但問題出現的時候我想在我的理解中加上一個else語句。 我似乎不知道該怎么做。 所以為了讓我的自我更清楚,我想用兩位數做同樣的事情,但唯一的區別是我想要兩個空格而不是每個雙位數之間的三個空格。
列表推導的左手接受任何Haskell表達式,因此我們可以在列表推導的左手中寫出if
- then
- else
並在右手上省略i < 10
條件:
concat [(""++show i)++if i < 10 then " " else " " | i <- [1..n]]++"\n"
對於n = 15
,這會產生:
Prelude> concat [(""++show i)++if i < 10 then " " else " " | i <- [1..n]]++"\n"
"1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 \n"
我們還可以刪除列表推導左側的""++
部分,因為這基本上是一個無操作 :
concat [show i ++ if i < 10 then " " else " " | i <- [1..n]] ++ "\n"
然而,上面不是很優雅:如果i = 123
,那么我們仍然會遇到麻煩。 我們可以計算show
的長度,計算4-l
(長度為l
),並將其作為額外間距添加。 例如:
concat [s ++ replicate (4-length s) ' ' | i <- [1..n], let s = show i] ++ "\n"
還有一些更專用的格式化和連接功能,但由於練習可能是為了使列表更加熟悉,我認為這超出了范圍。
就像@ 4castle所說,我們可以使用例如printf
:
import Text.Printf(printf)
concatMap (printf "%-4d") [1..n] ++ "\n"
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.