# LeetCode 224. Basic Calculator in F#

·

## URL

leetcode.com/problems/basic-calculator

## Code

github.com/syohex/dotnet-study/blob/master/..

``````let rec number (cs: char list) (acc: int64) : char list * int64 =
match cs with
| [] -> [], acc
| h :: t ->
if int h >= int '0' && int h <= int '9' then
let acc' = acc * 10L + ((int h - int '0') |> int64)
number t acc'
else
cs, acc

let rec expr (cs: char list) (acc: int64) : char list * int64 =
match cs with
| [] -> [], acc
| _ ->
let cs', value = factor cs 0 false

match cs' with
| [] -> [], value
| h :: t ->
if h = '+' || h = '-' then
let cs'', value2 = factor t 0 false

if h = '+' then
expr cs'' (acc + value + value2)
else
expr cs'' (acc + value - value2)
else
cs', acc + value

and factor (cs: char list) (acc: int64) (isNegative: bool) : char list * int64 =
match cs with
| [] -> [], acc
| h :: t ->
if h = '-' then
factor t acc true
elif h = '(' then
let cs', value = expr t 0
(List.tail cs'), value
else
let cs', value = number cs 0
cs', (if isNegative then -value else value)

let calculate (s: string) : int =
let cs =
s |> Seq.filter (fun c -> c <> ' ') |> Seq.toList

expr cs 0 |> snd |> int
``````