意外的标识符和缩进问题

时间:2014-11-01 15:25:04

标签: f#

我正在使用一些以let环境开头的代码。间距似乎是关闭的,无论我怎么修复它仍然似乎抛出错误。环境线也给我一个未完成的错误

let evaluate exp =
let binaryEval = function
    | Add -> ( + )
    | Sub -> ( - )
    | Mul -> ( * )
    | Div -> ( / )
    | Mod -> ( % )
    | Pow -> (fun a b -> a ** (bigIntToInt b))
    // (**) is a comment and ( ** ) represents a function that needs an int, not a bigInt as second arg

let unaryEval = function
    | Factorial,x -> factorial x
    | UMinus,x -> BigInteger.Negate x

let funEval = function 
    | ("sqrt", x:value) -> new value(System.Math.Sqrt(double x))
    | ("abs", x) -> bigint.Abs(x)
    | ("!", x:value) -> unaryEval(Factorial, x)
    | _ -> failwith "Unknown function"

let environment = new System.Collections.Generic.Dictionary<string, value>()
    environment.["x"] <- 2I
    environment.["y"] <- 3I    
    let lookup name =
        if environment.ContainsKey(name) then
           environment.[name]
        else
            failwith "Invalid variable name"           

let rec eval = function
    | BinaryOp(expr1, op, expr2) -> (binaryEval op) (eval expr1) (eval expr2)
    | Var str -> lookup str
    | UnaryOp(op, expr) -> unaryEval(op,(eval expr))
    | Num d -> d
    | Fun(funName, x::_) -> (funName,(eval x)) |> funEval
    | Fun(_,_) -> failwith "Unknown function"

eval exp

1 个答案:

答案 0 :(得分:2)

这是问题所在的环境之后的行 - let绑定已经完成,但它们没有任何理由缩进。你想要这个(在fsx中你可以删除do,但你需要取消这些行):

let environment = new System.Collections.Generic.Dictionary<string, value>()

do 
   environment.["x"] <- 2I
   environment.["y"] <- 3I    

let lookup name =
    if environment.ContainsKey(name) then
       environment.[name]
    else
        failwith "Invalid variable name"    

或许这个:

let environment, lookup = 
    let environment = new System.Collections.Generic.Dictionary<string, value>()

    environment.["x"] <- 2I
    environment.["y"] <- 3I    

    let lookup name =
        if environment.ContainsKey(name) then
           environment.[name]
        else
            failwith "Invalid variable name"    

    environment, lookup

let evaluate下的所有内容都需要缩进一个级别,但这可能只是在粘贴时出错。

相关问题