[<EntryPoint>]
let main argv =
//数字1桁
let next ( data : List<'a> ) v =
match List.tryFindIndex ( fun x -> v = x ) data with
| Some r ->
if r = data.Length - 1
then ( true, data.[ 0 ] )
else ( false, data.[ r + 1] )
| None ->
raise
<| new System.ArgumentOutOfRangeException(
v.ToString() + "は存在しません。" )
//1桁の数字を加算
let bridging ( data : List<'a> ) flag v =
if flag = true then [ data.[ 1 ]; v ] else [ v ]
let incrementCheck ( data : List<'a> ) v index =
if data.[ index ] = v then true else false
let add ( data : List<'a> ) value addValue =
let rec sub ( data : List<'a> ) upFlag value add index =
let flag = incrementCheck data add index
if flag = false
then
let newUpFlag, newValue = next data value
let newIndex = index + 1
if upFlag = true
then
sub data true newValue add newIndex
else
sub data newUpFlag newValue add newIndex
else ( upFlag, value )
let x, y = sub data false value addValue 0
bridging data x y
//10進数の漢数字でチェック
let table = [
"〇"; "一"; "二"; "三"; "四"; "五";
"六"; "七"; "八"; "九" ]
printfn "0 + 3 = %O" <| add table "〇" "三"
printfn "3 + 0 = %O" <| add table "三" "〇"
printfn "2 + 4 = %O" <| add table "二" "四"
printfn "4 + 2 = %O" <| add table "四" "二"
printfn "9 + 3 = %O" <| add table "九" "三"
printfn "3 + 9 = %O" <| add table "三" "九"
//終了
0