我刚刚开始学习Haskell,并且在网上遇到了一些问题。大多数时候,我可以找出解决方案,但无法以预期的输出格式将其打印出来。
例如,我尝试执行Pascal的三角程序。我找到了如何将Pascal的Triangle生成为Ints列表的列表,但是我不知道如何打印它。
这是我的代码。
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"
)。最后,它将结果字符串推到stdout上。main
以此替换您的最后一行,它应该做您想要的。
编辑:正如Yakym在他的回答中提到的,intercalate " "
并且intercalate "\n"
可以替换为unwords
和unlines
,使上面的代码更加简洁(它也消除了导入的需要Data.List
)。
putStr $ unlines $ map (unwords . map show) output
我更改putStrLn
为,putStr
因为unlines
自动在输出的末尾添加了换行符。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句