【问题标题】:What's the syntax to create nested if else statements with do's用do创建嵌套if else语句的语法是什么
【发布时间】:2019-02-09 17:03:38
【问题描述】:

所以我刚刚掌握了 Haskell 的窍门,并陷入了使用 Do 创建嵌套 if-else 语句的语法上。 我不确定,如果我应该使用多个 Do,或者我是否可以只用一个来完成这一切。 我也不确定是否应该使用 return 语句以及是否需要所有分号。

我尝试添加和删除大括号、return 语句、分号、不同的缩进,但不知道还能尝试什么。

我收到类似“ • 无法将预期类型‘m0 (m0 b0)’与实际类型‘Int’匹配”之类的错误 • 在“do”块的语句中:a

  1. 这是我正在尝试构建的那种结构,但它给了我错误。您可以将 getVal 函数想象为返回整数的任意函数:

    func :: Int -> Int
    func val = do {
       if val < 10
          then do {
              a <- getVal0;
              b <- getVal1;
              if (val+a+b) < 0
                 then return 1
                 else return 2}
          else if val > 10 
              then do {
                 a <- getVal2;
                 b <- getVal3;
                 if (val + a +b) < 0 
                   then return 0
                   else return 1}
          else return 99;     }
    

get val 的一个例子是:

    getVal :: Int
    getVal  = 5

所以这就是我想要发生的事情:

如果 val

如果 val > 10,则从 getVal2 获取 a,从 getVal3 获取 b。如果 val+a+b

如果 val 既不是 10 (val = 10) 则返回 99

感谢您的反馈和帮助!

【问题讨论】:

  • getVal0getVal1 是什么?但看起来您正在尝试使用 do 块,它既不必要又无效。 do 块仅用于单子内的计算 - Int 不是单子值,因此您不能使用 do 块来计算这样的值。
  • do 不会像您认为的那样做。 return&lt;- 同上。这个函数不需要这些。
  • 也许你想在这里使用let ... in ... 语法。
  • 我试着写一个答案,但这太宽泛了;需要解释 haskell 语法、纯度、do 表示法等。即使尝试修复此代码块也很大程度上取决于构成的getVal1 的类型。如果您仍然卡住,您可以尝试只问一个问题,使用 MCVE 吗?
  • @jberryman 我认为一个简单地显示使用let 的正确方法的答案,而不涉及为什么do 不合适,就足够了。 OP 评论说 getVal0getVal1 是函数,所以我们可以假设像 let a = getVal0 parm1 parm2 in ... 这样的东西是意图。

标签: haskell


【解决方案1】:

正如 cmets 中已经提到的,这里不需要 do&lt;-return。这些是用于单子代码的,但在这里您定义的是一个常规函数——周围没有单子。

所以,我们可以改用let .. in ..。这是一种可能的方法,对原始代码进行微小的更改。

func :: Int -> Int
func val =
   if val < 10 then let
      a = getVal0
      b = getVal1
      in if val + a + b < 0
         then 1
         else 2
   else if val > 10 then let
      a = getVal2
      b = getVal3
      in if val + a + b < 0 
         then 0
         else 1
   else 99

许多Haskeller 会考虑将最外层的ifs 变成守卫:

func :: Int -> Int
func val
   | val < 10 = let
      a = getVal0
      b = getVal1
      in if val + a + b < 0
         then 1
         else 2
   | val > 10 = let
      a = getVal2
      b = getVal3
      in if val + a + b < 0 
         then 0
         else 1
   | otherwise = 99

【讨论】:

  • 完全帮助我解决了我遇到的问题,非常感谢!
猜你喜欢
  • 2018-08-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-14
  • 2017-08-14
  • 1970-01-01
相关资源
最近更新 更多