gpt4 book ai didi

Haskell if else 列表理解

转载 作者:行者123 更新时间:2023-12-04 21:05:21 25 4
gpt4 key购买 nike

我正在尝试以正确的方式打印出一块板,如下所示:

  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"

关于Haskell if else 列表理解,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47291340/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com