使用do创建嵌套if else语句的语法是什么

ckl*_*oan 1 haskell

所以我只是抓住了Haskell,并坚持使用Do创建嵌套if-else语句的语法.我不确定,如果我应该使用多个Do或者如果我只用一个就可以完成所有操作.我也不确定是否应该使用return语句,如果所有分号都是必需的.

我尝试添加和删除大括号,返回语句,分号,不同的缩进,不知道还有什么要尝试.

我得到的错误如"•无法匹配预期类型'm0(m0 b0)'与实际类型'Int'•在'do'块的stmt中:a < - getVal"

  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;     }
    
    Run Code Online (Sandbox Code Playgroud)

get val的一个例子是:

    getVal :: Int
    getVal  = 5
Run Code Online (Sandbox Code Playgroud)

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

如果val <10,则从getVal0获取带有2个参数的值a,并从getVal1获取b.然后添加val + a + b,如果小于0,则返回1,否则返回2

如果val> 10,则从getVal2获取a并从getVal3获取b.如果val + a + b <0则返回0,否则返回1.

如果val既不<10或> 10(val = 10)则返回99

感谢您的反馈和帮助!

chi*_*chi 5

正如在评论中已经提到的,你并不需要do,<-或者return在这里.这些是monadic代码,但在这里你定义了一个常规函数 - 周围没有monad.

所以,我们可以改用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
Run Code Online (Sandbox Code Playgroud)

许多Haskellers会考虑将最外面的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
Run Code Online (Sandbox Code Playgroud)