【发布时间】:2021-10-11 18:58:31
【问题描述】:
我正在学习 Haskell,目前正在尝试重写此代码:
case class Coord(x: Int, y: Int)
def buildBoard(coords: [Coord]): String = {
var str = ""
for (i <- 0 to 30) {
for (j <- 0 to 40) {
if (coords.exists(c => c.x == i && c.y == j))
str += "x "
else
str += "o "
}
str += "\n"
}
str
}
这为我正在编写的命令行游戏构建了一个简单的板。我可以重写它的最简单方法是什么?我不是在寻找任何高性能的东西
我正在使用元组来实现Coord 类型:
type Coordinate = (Int, Int)
type Coordinates = [Coordinate]
可能的答案
我非常感谢那些提供帮助的人。我设法使用列表理解来完成工作。我的想法是摆脱之前代码的“迭代方法”。事实上,我想将一组“虚拟”坐标转换为字符串,我是这样做的:
createBoard :: Coordinates -> String
createBoard coordinates = concatMap parse board
where
parse coordinate@(_, y)
| coordinate `elem` coordinates = "x "
| y == 41 = "\n"
| otherwise = "o "
board = [ (x, y) | x <- [0..30], y <- [0..41] ]
【问题讨论】:
-
函数式编程(以及扩展声明式编程)的理念之一是您不应该考虑循环。
-
您可以尝试使用列表推导和/或
concat来解决这个问题。你不应该试图模仿你的命令式代码,而是以一种功能性的方式来表达结果,例如通过构建一个列表列表,您可以稍后将其连接起来以获得想要的结果。 -
另外,这个问题不应该被关闭。它对于仍然通过 fp 和 haskell 本身的初始步骤的任何人,或者(正如尊敬的用户 @AntC 甜言蜜语)“试图重写粗略的代码”的人都非常有用。
-
@WillNess Whos tag wiki 说“请注意,要求翻译您的代码不适合 Stack Overflow。”
-
@amalloy 它还说 '一个适当形式的问题可能是“我如何翻译这个陈述”',问题的原始标题是 “How can我在 Haskell 中重写了嵌套的 for 循环?”。看起来几乎一样。 :)
标签: for-loop haskell nested-loops code-translation nested-for-loop