我在写的F中遇到了代码和平的问题。
我在F#中创建了一个堆栈结构,还创建了push和pop函数,所有这些看起来都很好。
我还制作了一些指令(ADD、MULT、PUSH、ABS),用于处理堆栈中的整数项。
我做了一个函数,用作指令的interepreter;它输入一个堆栈和一条指令,输出是包含指令结果的堆栈。当我尝试在解释器中使用push函数时,它不再工作,它完全忽略了命令。
type stack =
| Stck of int list
type instr =
| ADD
| MULT
| PUSH of int
| ABS
let stackPush stck num =
match stck with
| Stck(someList) ->
match someList with
| [] -> Stck[num]
| _ -> Stck(num::someList)
let stackPop stck =
match stck with
| Stck(someList) ->
match someList with
| [] -> Stck[]
| _::xEnd -> Stck(xEnd)
let getFirstItem stck =
match stck with
| Stck(someList) ->
match someList with
| [] -> 0
| [xOnly] -> xOnly
| xStart::_ -> xStart
let exec stck instr =
match stck with
| Stck(someList) ->
match someList with
| [] -> Stck[]
| [xOnly] -> Stck[xOnly]
| xStart::xMid::xEnd ->
let tempStack = stackPop(stackPop(stck))
match instr with
| ADD ->
match tempStack with
| _ -> Stck((xStart + xMid)::xEnd)
| MULT ->
match tempStack with
| _ -> Stck((xStart * xMid)::xEnd)
| PUSH x -> stackPush stck x
| ABS -> Stck(abs( xStart)::xEnd)
当我运行它们时,问题就会出现
let mutable stackProva = Stck[]
stackProva <- exec stackProva (PUSH 5) //not working
当我运行
exec stackProva(推送5)
,得到的结果是空堆栈
stackProva <- stackPush stackProva -3 //working
当我跑步时
stackPush stackProva-3
,它实际上将整数-3放入堆栈中。他们在为我所想的做同样的事情,但在一个方面是可行的,在另一个方面(我真正想要的)是行不通的。
运行这两个命令后我所期望的
stackProva公司
包含[-3;5],但它只包含[-3]。
谢谢你能给我的任何帮助。