【问题标题】:Is it possible to write nested conditional statements in Haskell?是否可以在 Haskell 中编写嵌套条件语句?
【发布时间】:2013-08-04 11:51:42
【问题描述】:

我仍在努力学习 Haskell 的语法,因为它不同于我以前见过的任何其他编程语言。在大多数命令式编程语言中,可以像这样创建嵌套条件语句:

function thing1(x){
    if(x > 2){
       if(x < 5){
           return 3;
       }
       else if(x < 10){
           return 10;
       }
       else if(x >= 10){
           return 6;
       }
    }
    else{
        return 4;
    }

}

但是,经过几次尝试,我仍然没有弄清楚 Haskell 中的等效语法:我尝试在 Haskell 中创建等效函数,但出现语法错误:prog.hs:10:1: parse error on input main':

thing1 x =
    if x > 2 then
        if x < 5 then
            3
        else if x < 10 then
            10
        else if(x >= 10)
            6
    else
        4

main = do
    putStr(show(thing1 6))

我不确定这里的语法有什么问题:是否可以像在其他语言中一样在 Haskell 中创建嵌套条件语句?

【问题讨论】:

  • 这里的错误与if/else无关,而与main的缩进有关。它必须与thing1 在同一列中开始。
  • 如果 x >= 10 结果是什么?
  • @chirlu 如果程序格式正确,它将返回4
  • @AndersonGreen 不,不会。当然不是任何流行的带大括号的语言。在 JS 中是 undefined.
  • 一个不相关的小提示 -- putStrLn . show 有一个别名 print

标签: haskell conditional-statements


【解决方案1】:

正如几个人所建议的,您可以使用模式保护更轻松地做到这一点:

thing1 x
  | x <=  2 = 4
  | x <   5 = 3
  | x <  10 = 10
  | x >= 10 = ???

main = putStr (show (thing1 6))

这不是更整洁吗?准确计算每种情况下返回的内容不是容易得多吗?

更新:在我忘记之前,一个常见的习惯是这样做:

thing1 x
  | x <=  2   = 4
  | x <   5   = 3
  | x <  10   = 10
  | otherwise = 6

这让不经意的观察者更清楚,实际上所有案例都已涵盖。

【讨论】:

  • 是的 - 您需要定义该案例的答案。
  • 我认为您已经为我的问题找到了一个很好的解决方法(这可能比我原来的方法更好),但它仍然不能完全回答它。只要每一系列语句都以else结尾,是否可以将嵌套条件语句用于相同的目的?
  • @AndersonGreen 当然,如果您愿意,可以使用长嵌套的 if/then/else。 (只要每个if 恰好有一个then 和一个else,当然......)
【解决方案2】:

你在if(x &gt;= 10) 之后忘记了then,你还需要一个else 分支。但由于if(x &gt;= 10) 已经是if x &lt; 10else 分支,您可以删除if(x &gt;= 10) 或将其添加到评论中:

thing1 x =
if x > 2 then
    if x < 5 then
        3
    else if x < 10 then
        10
    else
        6
else
    4

【讨论】:

    【解决方案3】:

    您在 X > 2 部分中没有不完整(未回答)的分支吗?

     if x < 5 then
        3
     else if x < 10 then
        10
     // else, what answer here?
    

    Haskell 中的else 是强制性的。

    见:http://en.wikibooks.org/wiki/Haskell/Control_structures

    【讨论】:

    • 使用警卫。反正更好。
    • 我认为你应该在 Haskell 中编写有价值的表达式,而不是 GOTO 和 BREAK 语句!如果它不是一个表情,它就不会飞。你在这里不是必须的。
    • @AndersonGreen 想想这在函数式语言中意味着什么。一切都是一种表达。每个表达式都必须返回一些东西。如果 x 不为真, (if x then y) 会返回什么?尝试将您的 if/else 结构可视化为一系列嵌套表达式,您会发现概念问题出在哪里。
    • @ThomasW 那么是否可以在 Haskell 中编写嵌套条件语句,只要每一系列条件语句都以else 结尾?这似乎解决了我的问题。
    • @AndersonGreen if &lt;expression&gt; then &lt;expression&gt; else &lt;expression&gt; 是 Haskell 中的一个表达式。它可以出现在表达式可以出现的任何地方,包括 if/then/else 的子表达式之一。没有“一系列条件语句”之类的东西,每个if 都有一个then 部分和一个else,以及它是否恰好嵌套在另一个 if/then/else 的一部分中完全无关。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-05-16
    • 2023-01-28
    • 2018-10-06
    • 1970-01-01
    • 2011-08-12
    • 2017-04-04
    • 2012-02-17
    相关资源
    最近更新 更多