我试图以正确的方式打印出一块电路板,如下所示:
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语句。我似乎不知道该怎么做。所以为了让我的自我更清楚,我想用两位数做同样的事情,但唯一的区别是我想要两个空格而不是每个双位数之间的三个空格。
答案 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