在 Haskell 中,do 块中的 if/then/else 中的语法如何工作

Joe*_*nge 0 haskell

我正在尝试制作以下功能:

repcountIORIban :: IORef -> Int -> Int -> Int -> Int -> Lock -> IORef -> Lock -> Int -> Int -> IO ()
repcountIORIban count number lower modulus amountthreads lock done lock2 difference rest = do
        if rest > number
            then let extra = 1
            else let extra = 0
        if number + 1 < amountthreads
            then
                forkIO $ realcountIORIban(count lower (lower + difference + extra - 1) modulus lock done lock2)
                repcountIORIban (count (number + 1) (lower + difference + extra) modulus amountthreads lock done lock2 difference rest)
            else
                forkIO $ realcountIORIban(count lower (lower + difference + extra - 1) modulus lock done lock2)
Run Code Online (Sandbox Code Playgroud)

但是我无法运行该函数所属的程序。它给了我错误:

error: parse error on input `else'
    |
113 |             else let extra = 0
    |             ^^^^
Run Code Online (Sandbox Code Playgroud)

我在我的程序中多次遇到此错误,但我不知道我做错了什么。

chi*_*chi 5

这是不正确的,您不能letthen/之后else并期望那些lets 定义在下面可见的绑定。

do if rest > number
     then let extra = 1  -- wrong, needs a "do", or should be "let .. in .."
     else let extra = 0
   ... -- In any case, extra is not visible here
Run Code Online (Sandbox Code Playgroud)

试试这个

do let extra = if rest > number
               then 1
               else 0
   ...
Run Code Online (Sandbox Code Playgroud)

此外,then do如果之后您需要执行两个或多个操作,则需要。

if number + 1 < amountthreads
  then do
    something
    somethingElse
  else         -- use do here if you have two or more actions
    ...
Run Code Online (Sandbox Code Playgroud)