在嘗試在 Haskell 中實作著名的Ackermann 函式以測驗所承諾的運行時間差異是否實際上是可測量的時,我偶然發現了一個錯誤描述的美妙之處:
Parse error in pattern: a - 1 Possibly caused by a missing 'do'?
我知道這個決議錯誤很常見,我不知道為什么會這樣。除此之外,我的代碼(見下文)應該沒問題。
我的代碼:
main :: IO ()
main = do
print "Please enter first operand: "
input <- getLine
let n = read input
print "Please enter second operand: "
input <- getLine
let m = read input
let r = ak(n,m)
print(n " ackermann " m " = " show r)
ak(a,b) = do
if a == 0
then return (b 1)
else if b == 0
then return ak(a-1, 1)
else
s1 <- ak(a-1, b)
s2 <- ak(a-1, s1)
return s2
uj5u.com熱心網友回復:
不要使用doand return。塊用于一元計算。您可以使用:akdo
ak 0 b = b 1
ak a 0 = ak (a-1) 1
ak a b = ak (a-1) (ak a (b-1))
然后你可以實作main為:
main :: IO ()
main = do
print "Please enter first operand: "
n <- readLn
print "Please enter second operand: "
m <- readLn
putStrLn (show n " ackermann " show m " = " show (ak n m))
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/494276.html
下一篇:為什么我的并行代碼運行很差?
