得到一個我無法理解的錯誤
基本上我的程式應該對自定義資料型別“配置”執行操作
type Vname = String
type Val = Int
type State = [(Vname, Val)]
data Instr =
LOADI Int
| LOAD Val
| ADD
| STORE Val
| JMP Int
| JMPLESS Int
| JMPGE Int
deriving (Eq, Read, Show)
data Stack = Stack [Int]
type Config = (Int, State, Stack)
iexec :: Instr -> Config -> Config
iexec (LOADI n) c = do {
(x,y,z) <- c
;return ( x 1, y, x )
}
我只嘗試執行“LOADI”指令之一,但無論我似乎如何更改,我都會收到錯誤訊息:
? Couldn't match expected type ‘Stack’
with actual type ‘(c1, b0, c0)’
? In the pattern: (x, y, z)
In a stmt of a 'do' block: (x, y, z) <- c
In the expression:
do (x, y, z) <- c
return (x 1, y, x)
|
42 | (x,y,z) <- c
| ^^^^^^^
堆疊只是一個 Int 串列,但我必須以這種方式實作它
什么是 (c1, b0, c0) 以及為什么我的配置元組的第三個值與其他值的作業方式不同?
任何幫助將非常感激!
喬
uj5u.com熱心網友回復:
iexec :: Instr -> Config -> Config
好的,所以iexec需要兩個引數并回傳一個Config(元組)。
iexec (LOADI n) c = do
哦,但是這說iexec需要兩個引數并以形式回傳一些東西Monad m => m a (通常是初學者的 IO,但并非總是如此)。
你不想要do符號 - 你根本沒有進行一元操作,只是一個純粹的非一元計算。為此,您應該let ... in ...在需要中間值時使用,或者如果不需要則只使用結果運算式:
iexec :: Instr -> Config -> Config
iexec (LOADI n) (x,y,z) = (x 1, y, x)
或者考慮等價物:
iexec :: Instr -> Config -> Config
iexec (LOADI n) (x,y,z) =
let newPC = x 1
newState = y
newStack = x
in (newPC, newState, newStack)
不當然,這個newStack值x根本不會起作用,因為 Stack 不是Int,但這只是匹配您的原始代碼。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/389031.html
下一篇:組合:圣彼得游戲演算法
