簡體   English   中英

Haskell如果否則列出理解

[英]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.

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