【问题标题】:Haskell - How do I nest multiple if statements containing multiple putStrLn satatements [closed]Haskell - 如何嵌套包含多个 putStrLn satatements 的多个 if 语句 [关闭]
【发布时间】:2018-08-26 23:53:39
【问题描述】:

这是the problem的要点:

check_if_proceed configFolders = do
  let emacsdf = "/home/jacek/.emacs.d"
  traceM ("calling check_if_proceed " ++ show ("ccc",configFolders))
  exists <- doesDirectoryExist emacsdf
  symlink <- pathIsSymbolicLink emacsdf
  let confemp = configFolders == []
  let result = False
  if exists
    then do
    {
      if symlink
      then do
        {
          putStrLn ("This action will overwrite the existing symlink\n"++
                    "poinitng to " ++ "SOMEWHERE-FINISH ME\n\n" )
        }
      else do
        {
          putStrLn (emacsdf ++ " is not a symlink\n"++
                    "to use this utility, in your terminal do soemthing like:\n"++
                    "$ mv " ++ emacsdf ++ " " ++ emacsdf ++ "-alternative-config\n" ++
                    "exiting..." )
        }
    }
    else do
    {
      putStrLn ("no " ++ emacsdf ++ "found in your home folder")
      if confemp
      then do
        {
          putStrLn ("nor folders with the alternative emacs config\n" ++
                    "exiting..." )

        }
      else
        do {
          putStrLn "will try to symlink one of the found folders"
          }
    }

奖励积分用于指示如何向其中添加返回语句。

工作代码

此链接显示了一些有效的代码,允许我使用命令式样式探索问题空间。

【问题讨论】:

  • Haskell 有 no return 语句,它有一个 return 函数,它not 像命令式语言中的 return 语句一样工作.
  • 如果您从该代码中删除所有花括号,而不更改缩进,它应该修复解析错误。此外,花括号很少在 Haskell 中显式使用。
  • 对工作代码的批评或改进建议属于 CodeReview,而不是 SO。 :)

标签: haskell syntax do-notation


【解决方案1】:

您在line 31 上的putStrLnif 之间缺少一个 分号:

    ....
    else do
    {
      putStrLn ("no " ++ emacsdf ++ "found in your home folder")
    ;                                                            -- HERE
      if confemp
      then do
        {
          putStrLn ("nor folders with the alternative emacs config\n" ++
                    "exiting..." )

        }
    ....

要遵循的模板是

    do { ... ; ... ; ... }

显式大括号分号将防止由于代码中的错误缩进(可能是由于制表符/空格问题)而导致的任何解析错误。

完全显式 表示法总是在每个do 块语句之间使用;if ... then ... else ... 弥补了 一个 表达式/do 语句,即使分布在几行代码中。

【讨论】:

    猜你喜欢
    • 2022-12-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多