代码之家  ›  专栏  ›  技术社区  ›  E. Peracchia

F#函数调用工作不正常

  •  3
  • E. Peracchia  · 技术社区  · 8 年前

    我在写的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]。

    谢谢你能给我的任何帮助。

    1 回复  |  直到 8 年前
        1
  •  3
  •   Szer    8 年前

    问题在于您的 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"