Haskell如果否则列出理解

时间:2017-11-14 17:00:45

标签: haskell 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语句。我似乎不知道该怎么做。所以为了让我的自我更清楚,我想用两位数做同样的事情,但唯一的区别是我想要两个空格而不是每个双位数之间的三个空格。

1 个答案:

答案 0 :(得分:2)

list comprehension的左手接受任何Haskell表达式,因此我们可以在列表推导的左侧写if - then - else并省略{{ 1}}右边的条件:

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

还有一些更专用的格式化和连接功能,但由于练习可能会使列表更加熟悉,我认为这超出了范围。

就像@ 4castle所说,我们可以使用例如concat [s ++ replicate (4-length s) ' ' | i <- [1..n], let s = show i] ++ "\n"

printf