for-loop - 在 Haskell 中重写嵌套 for 循环的好技术是什么?

标签 for-loop haskell nested-loops code-translation nested-for-loop

我正在学习 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] ]

最佳答案

正如您已经发现的那样,“嵌套循环”部分在很大程度上可以通过列表理解来完成。
但是原始代码中的所有其他内容也可以通过列表理解来完成!首先对外循环使用一个列表推导式:

Prelude> [ "foo" | i <- [0..3] ]
["foo","foo","foo","foo"]
您真的不需要处理换行符,只需使用标准 unlines 功能
Prelude> unlines [ "foo" | i <- [0..3] ]
"foo\nfoo\nfoo\nfoo\n"
现在是内循环。这应该会产生单个字符串/列表,因此您可以 concat单个列表,但同样有一个标准函数,它还会添加您总是放在两个字符之间的空格:
Prelude> putStrLn $ unlines [ unwords ["a" | j <- [0..4]] | i <- [0..3] ]
a a a a a
a a a a a
a a a a a
a a a a a
最后我们可以使用条件来决定使用什么字符:
Prelude> putStrLn $ unlines [ unwords [if i>j then "x" else "o" | j <- [0..4]] | i <- [0..3] ]
o o o o o
x o o o o
x x o o o
x x x o o
现在让我们将所有这些包装在一个函数中:
createBoard :: Coordinates -> String
createBoard cs
 = unlines [ unwords [ if (i,j)`elem`cs then "x" else "o"
                     | j <- [0..40]
                     ]
           | i <- [0..30]
           ]

关于for-loop - 在 Haskell 中重写嵌套 for 循环的好技术是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68689079/

相关文章:

java - 在没有线程的情况下停止程序

嵌套for循环的Big-O复杂性

nested-loops - 嵌套循环的效率

java - 尝试在 while 循环中获取 int 输入的总和

linux - Bash 脚本 - 使用 find -exec cp 的 For 循环产生错误 : cp: omitting directory

java - 在这种情况下,为什么我不能说 variable.array?

c - 读入文件导致段错误

haskell - 顶级 OverloadedLists 字面量

python - 这段 Python 代码的 Haskell 等价物

macos - 在 MacOS X 上的 GHCi 中工作的 Haskell 图形库