我正在尝试制作以下功能:
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)
我在我的程序中多次遇到此错误,但我不知道我做错了什么。
这是不正确的,您不能let在then/之后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)