我正在使用一些以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
答案 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
下的所有内容都需要缩进一个级别,但这可能只是在粘贴时出错。