【发布时间】:2016-08-18 03:46:11
【问题描述】:
我试图在 f# 中使用两个数组创建一个计算器,一个用于存储数字,另一个用于存储运算符符号。我需要符号数组与符号进行模式匹配,并根据运算符从数组中获取前两个元素并执行操作并将新数字添加到第二个数组的头部。
open System
[<EntryPoint>]
let main argv =
printfn "%A" argv
let Add x y = x + y
let Sub x y = x - y
let Div x y = x * y
let Mul x y = x / y
printfn "1 > Calculator \n2 > Load from txt file"
let chosenIn = Console.ReadLine();
//This is where I need to do the operation and after call the sum function
//again until there's only one element left in the number array
let rec sum num (numArray : int[]) sym (symArray : string[]) () =
let rec calc () =
printfn "Enter Sum"
let input = Console.ReadLine()
let intInput = input.Split()
let numArray = [|for num in intInput do
let v , vp = System.Int32.TryParse(num)
if v then yield vp|]
let symbolArray = [|for symbol in intInput do
match symbol with
| "+" -> yield symbol
| "-" -> yield symbol
| "/" -> yield symbol
| "*" -> yield symbol
| _ -> ignore 0|]
calc()
match chosenIn with
| "1" -> calc()
| "2" -> printfn "File"
| _ -> printfn "Invalid"
0 // return an integer exit code
【问题讨论】:
-
这个问题定义不明确,少数代码片段对澄清问题可能是什么帮助不大。当前代码接受“1 2 3 4”作为输入,就像它接受“+ - /”或“1 2 / + 3 * *”一样,请说明在这些情况下的预期行为是什么。
-
其中一个主要问题是对于
+、-和*,签名是int -> int -> int,但对于/,它可以是int -> int -> int或int -> int -> float这就是为什么如果您查看某些示例,您会看到答案省略了/。此外,输入应该与运算符和操作数组合到一个堆栈中,以便可以使用reverse polish notation。 -
我希望用户输入一个简单的和,例如“4 + 2”,然后应用程序将字符串解析为输入字符串数组,然后将输入字符串数组解析为两个数组,一个用于数字和符号中的一个,例如 numArray = [| 4; 2;|] 符号数组 = [| “+”|]。然后调用以两个数组作为参数的 sum 函数。该函数将查看符号数组中的第一个符号,并根据该符号确定对 num 数组中的前两个元素使用的运算符。并返回一个新的 num 数组,其中包含新计算的数字。
-
为什么要为数字和运算符创建一个数组?例如,这会让每个人都认为您还需要处理具有 >1 个运算符的情况。您是否只期望像“number op number”这样的输入,或者还有其他的输入吗?
-
即使用户输入了多个运算符,例如“5 + 3 - 1”,sum 函数也是递归的,这意味着它会调用不止一次。例如 "5 + 3 - 1" -> [5 ,3, 1] 和 [ "+", "-"] 并且在第一次调用之后它将创建两个新数组 [8, 1] 和 ["-]。程序将看到仍然有两个数字,并将再次运行创建只剩下一个数字,这将是结果
标签: arrays recursion f# pattern-matching calculator