F# 函数调用ain';t工作不正常
我在F#中遇到了代码和平的问题,我写道。 我在F#中制作了一个堆栈结构,还制作了push和pop函数,所有这些看起来都很好。 我还制作了一些指令(ADD、MULT、PUSH、ABS),用于处理堆栈中的整数项。 我做了一个函数,作为指令的中间计;它在输入端得到一个堆栈和一条指令,输出端是包含指令结果的堆栈。当我尝试在解释器中使用push函数时,它不再工作,它完全忽略了命令F# 函数调用ain';t工作不正常,f#,stack,F#,Stack,我在F#中遇到了代码和平的问题,我写道。 我在F#中制作了一个堆栈结构,还制作了push和pop函数,所有这些看起来都很好。 我还制作了一些指令(ADD、MULT、PUSH、ABS),用于处理堆栈中的整数项。 我做了一个函数,作为指令的中间计;它在输入端得到一个堆栈和一条指令,输出端是包含指令结果的堆栈。当我尝试在解释器中使用push函数时,它不再工作,它完全忽略了命令 type stack = | Stck of int list type instr = | ADD | MULT
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
let可变stackProva=Stck[]
stackProva问题在于exec
的实现。如果它使用空堆栈,它会立即返回空堆栈
以下是工作版本:
type Stack = Stack of int list
type Instruction =
| ADD
| MULT
| ABS
| PUSH of int
let push num (Stack stack) = Stack (num::stack)
let pop (Stack stack) =
match stack with
| [] -> []
| _::tail -> tail
let tryGetFirstItem (Stack stack) = List.tryHead stack
let exec instr (Stack stack) =
match stack, instr with
| s1::s2::tail, ADD -> Stack (s1+s2::tail)
| s1::s2::tail, MULT -> Stack (s1*s2::tail)
| s1::tail, ABS -> Stack (abs(s1)::tail)
| _, PUSH x -> push x (Stack stack)
| x, _ -> Stack x
Stack []
|> exec (PUSH 1)
|> exec (PUSH 2)
|> exec ADD
|> tryGetFirstItem
|> printfn "%A" //prints "Some 3"
type Stack = Stack of int list
type Instruction =
| ADD
| MULT
| ABS
| PUSH of int
let push num (Stack stack) = Stack (num::stack)
let pop (Stack stack) =
match stack with
| [] -> []
| _::tail -> tail
let tryGetFirstItem (Stack stack) = List.tryHead stack
let exec instr (Stack stack) =
match stack, instr with
| s1::s2::tail, ADD -> Stack (s1+s2::tail)
| s1::s2::tail, MULT -> Stack (s1*s2::tail)
| s1::tail, ABS -> Stack (abs(s1)::tail)
| _, PUSH x -> push x (Stack stack)
| x, _ -> Stack x
Stack []
|> exec (PUSH 1)
|> exec (PUSH 2)
|> exec ADD
|> tryGetFirstItem
|> printfn "%A" //prints "Some 3"