F#中的简单计算器使用正则表达式

时间:2017-11-28 14:55:04

标签: .net regex f# mono

我被要求由我的老师创建一个简单的计算器(一个支持+, - ,*和/)。它应该采取用户输入并打印结果。它应该永远运行并保存最后的计算结果。

我想通过使用正则表达式来实现,因为我最近已经介绍过这个,但我无法弄清楚如何让它工作。 这是我创建的,但它不起作用。

let getInput () =
    System.Console.Write ("give input: ")
    let s = System.Console.ReadLine ()
    s 

let simpleCalc () =
let numb1 = "[0-9]*"
let numb2 = "[0-9]*"
let operator = "[+-*/]"
while true do
    let s = getInput ()
    match s with
        | "([0-9]*)([+-*/]?)([0-9]*)" [ int1; operator; int2 ] -> int1 operator int2
        | _ -> printfn "thas no simple maf"

1 个答案:

答案 0 :(得分:1)

如评论中所述,您需要在某处使用正则表达式。实现此目的的一种方法(与您编写的内容非常接近)是定义一个活动模式,如果输入与给定的正则表达式匹配并将匹配的组作为列表返回,则该模式会成功:

open System.Text.RegularExpressions

let (|Regex|_|) regex input = 
  let res = Regex.Match(input, regex)
  if res.Success then Some (List.tail [for g in res.Groups -> g.Value])
  else None

基本算术的简单评估器可以实现为:

let s = "123*5"
let ops = dict [ "+", (+); "-", (-); "*", (*); "/", (/)]
match s with
| Regex "([0-9]*)([\+\-\*\/])([0-9]*)" [left; op; right] -> 
    ops.[op] (int left) (int right)
| _ -> -1

请注意,我们需要将运算符的字符串表示形式转换为我们可以以某种方式调用的F#函数 - 所以我使用dict定义了一个简单的查找表。