如何在单个函数中执行多个语句?

Cam*_*ron 1 recursion haskell functional-programming

我正在学习Haskell,而且我必须打印一个Snakes and Ladders游戏.刚开始,我正在尝试打印电路板,这就是我所做的.

import Data.List
aRow :: Int -> String
aRow n = "+" ++ take (4*n) (intercalate "" (repeat "---+")) ++ "\n|" ++      take (4*n) (intercalate "" (repeat "   |")) ++ "\n"

board :: Int -> Int -> IO()
board 1 y = putStrLn (aRow y)
Run Code Online (Sandbox Code Playgroud)

我想要另一个董事会实例,它需要参数x和y

board x y = putStrLn (aRow y)
            board (x-1) y
Run Code Online (Sandbox Code Playgroud)

我知道我不能只调用这样的多个语句,但任何人都可以提供一些有关我如何能够同意这一点的见解吗?我想用参数'y'调用aRow并执行'x'次.

谢谢.

另外:当我拨打电话板1时,我将其作为输出:电路板1 5
+ --- + --- + --- + --- + --- +
| | | | | |

bas*_*nry 7

我认为最干净的方法是在不做任何事情的情况下创建电路板IO,然后最后只使用它来打印出来IO.

您可以使用concatreplicate实现此目的:

board :: Int -> Int -> String
board x y = concat (replicate y (aRow x))
Run Code Online (Sandbox Code Playgroud)

你可能在底部错过了一条线,但我会让你弄清楚这一点!

顺便说一句,take (4*n) (intercalate "" (repeat "---+"))就像concat (replicate n "---+")你写的aRow那样:

aRow :: Int -> String
aRow n = '+' : concat (replicate n "---+")
      ++ "\n|" ++ concat (replicate n "   |")
      ++ "\n"
Run Code Online (Sandbox Code Playgroud)

编辑:我会用多个行unlines :: [String] -> String连接几个String:

aRow :: Int -> String
aRow n = unlines
  [ '+' : concat (replicate n "---+")
  , '|' : concat (replicate n "   |")
  ]
Run Code Online (Sandbox Code Playgroud)