haskell - 在 Haskell 中打印 Pascal 的三角形

标签 haskell pascals-triangle

我刚开始学习 Haskell,并且一直在网上做一些问题。大多数时候,我可以找出解决方案,但无法以预期的输出格式打印出来。

例如,我尝试编写 Pascal 的三角形程序。我发现了如何将帕斯卡三角生成为整数列表的列表,但我不知道如何打印它。

这是我的代码。

import Data.List
pascal n = map liner [0..n]
    where liner x = map (comb x) [0..x]

comb n 0 = 1
comb 0 r = 0
comb n r = comb (n-1) (r-1) * n `div` r 

main = do
    order <- getLine
    let output = pascal . (read :: String -> Int) $ order
    print output 

目前,输出是这样的

[[1],[1,1],[1,2,1],[1,3,3,1]...

我要打印成表格

1
1 1
1 2 1
1 3 3 1
...

我该怎么做?我曾尝试使用 mapM_ 或插入“”之类的东西,但没有成功。我还不喜欢 monad,所以我不明白 mapM 是如何工作的。

最佳答案

有几种不同的方法可以做到这一点,但最直接的 (IMO) 方法如下。

putStrLn $ intercalate "\n" $ map (intercalate " " . map show) output

这首先将列表中的所有数字转换为字符串(使用 show)。然后它将最里面的列表转换为字符串,其中每个元素由空格分隔(使用 intercalate "")。然后它将最外层 列表转换为一个字符串,其中每个元素由换行符 分隔(使用intercalate "\n")。最后,它将结果字符串推送到标准输出。用这个替换 main 的最后一行,它应该可以做你想做的事。

编辑: 正如 Yakym 在他的回答中提到的,intercalate ""intercalate "\n" 可以替换为 unwordsunlines,使上面的代码更加简洁(它还消除了导入 Data.List 的需要)。

putStr $ unlines $ map (unwords . map show) output

我将 putStrLn 更改为 putStr 因为 unlines 会自动在输出的末尾添加一个换行符。

关于haskell - 在 Haskell 中打印 Pascal 的三角形,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36895974/

相关文章:

haskell - 如何为所有包自定义 Haddock 文档生成?

Haskell IO 执行顺序

haskell - 在 Haskell 中构建一棵树

java - 帕斯卡三角广义公式推导

c - C 奇怪输出中的帕斯卡三角形

javascript - 如何在 Javascript 中编写 Pascal 三 Angular 形 - 混淆数组

haskell - 如何定义一个接受数据类型的自然数并返回它们的总和的函数?

haskell - Yesod ExitFailure 1 安装脚手架应用程序时

python - Python 的减量循环比增量循环运行得慢吗?

java - 尝试构建帕斯卡三角形时错误的多维数组初始化(JAVA)