0

在这个社区成员的帮助下,尤其是 Daniel,我可以创建帕斯卡三角形编号列表。但是每当我想将三角形​​显示为三角形时,它都会出现错误,例如:输入“导入”时出现解析错误。我预计 some1 会向前解释这一点。代码如下:

    import Text.Printf

    pascal :: [[Integer]]
    pascal = iterate (\prev -> 1 : zipWith (+) prev (tail prev) ++ [1]) [1]

    prettyPascal :: Int -> IO ()
    prettyPascal n = mapM_ (\r -> printf "%*s\n" (div (longest + length r) 2) r) rows
    where rows = map (unwords . map show) $ take (n + 1) pascal
      longest = length $ last rows
4

1 回答 1

1

总结答案:

module PrettyPascal where  -- good practice, means you can combine it with other code
import Text.Printf

pascal :: [[Integer]]
pascal = iterate (\prev -> 1 : zipWith (+) prev (tail prev) ++ [1]) [1]

where必须比前一行进一步缩进,并且longest必须与rows:

prettyPascal :: Int -> IO ()
prettyPascal n = mapM_ (\r -> printf "%*s\n" (div (longest + length r) 2) r) rows
 where rows = map (unwords . map show) $ take (n + 1) pascal
       longest = length $ last rows

你可以这样做 main = prettyPascal 10,但你可能更喜欢:

main = 
    putStrLn "How many rows of Pascal's triangle would you like to see?"
    >> readLn >>= prettyPascal

(如果您使用的是 ghci 或 Hugs,则不需要main,只需prettyPrint 10在提示符处键入即可。)

以下讨论的其他要点:

  • Haskell 区分大小写,所以它必须是prettyPascal,而不是PrettyPascal
  • 当您使用类型类(如在其他代码中)时,您需要Eq a =>而不是Eq a ->
  • 使用复制和粘贴来避免输入错误
  • 将您的函数保存在一个名为PrettyPascal.hs.
  • 然后通过键入在 ghci 中加载您的函数:l PrettyPascal
  • 有时,如果您不确定是您的编译器还是您的代码,请复制并粘贴到codepad.org第二个意见。(你也可以下载并安装快速 Hugs 编译器,它执行 Haskell 98 和多参数类型类,但不是很多 ghc 扩展。)
于 2012-11-13T21:20:44.457 回答