ONLY DO WHAT ONLY YOU CAN DO

こけたら立ちなはれ 立ったら歩きなはれ

F# で Project Euler Problem 2

> [1; 2; 3; 5; 8; 13; 21; 34; 55; 89; 144; 233; 377; 610; 987; 1597; 2584; 4181; 6765; 10946; 17711; 28657; 46368; 75025; 121393; 196418; 317811; 514229; 832040; 1346269; 2178309; 3524578]
- ;;
val it : int list =
  [1; 2; 3; 5; 8; 13; 21; 34; 55; 89; 144; 233; 377; 610; 987; 1597; 2584;
   4181; 6765; 10946; 17711; 28657; 46368; 75025; 121393; 196418; 317811;
   514229; 832040; 1346269; 2178309; 3524578]
> [1; 2; 3; 5; 8; 13; 21; 34; 55; 89; 144; 233; 377; 610; 987; 1597; 2584; 4181; 6765; 10946; 17711; 28657; 46368; 75025; 121393; 196418; 317811; 514229; 832040; 1346269; 2178309; 3524578]
- |> List.filter(fun n -> n % 2 = 0)
- ;;
val it : int list =
  [2; 8; 34; 144; 610; 2584; 10946; 46368; 196418; 832040; 3524578]
> [1; 2; 3; 5; 8; 13; 21; 34; 55; 89; 144; 233; 377; 610; 987; 1597; 2584; 4181; 6765; 10946; 17711; 28657; 46368; 75025; 121393; 196418; 317811; 514229; 832040; 1346269; 2178309; 3524578]
- |> List.filter(fun n -> n % 2 = 0)
- |> List.sum
- ;;
val it : int = 4613732
>
> let rec fib fib_list =
-     let i = fib_list.[0] + fib_list.[1] in
-     if i <= 4000000 then fib(i::fib_list)
-     else                        fib_list
- ;;

      let i = fib_list.[0] + fib_list.[1] in
  ------------^^^^^^^^^^^^

stdin(114,13): error FS0752: The operator 'expr.[idx]' has been used an object of indeterminate type based on information prior to this program point. Consider adding further type constraints
> let rec fib fib_list:list<int> =
-     let i = fib_list.[0] + fib_list.[1] in
-     if i <= 4000000 then fib(i::fib_list)
-     else                        fib_list
- ;;

      let i = fib_list.[0] + fib_list.[1] in
  ------------^^^^^^^^^^^^

stdin(119,13): error FS0752: The operator 'expr.[idx]' has been used an object of indeterminate type based on information prior to this program point. Consider adding further type constraints
> let rec fib (fib_list:list<int>) =
-     let i = fib_list.[0] + fib_list.[1] in
-     if i <= 4000000 then fib(i::fib_list)
-     else                        fib_list
- ;;

val fib : int list -> int list

> let fib_list:list<int> = [2;1];;

val fib_list : int list = [2; 1]

> fib(fib_list);;
val it : int list =
  [3524578; 2178309; 1346269; 832040; 514229; 317811; 196418; 121393; 75025;
   46368; 28657; 17711; 10946; 6765; 4181; 2584; 1597; 987; 610; 377; 233; 144;
   89; 55; 34; 21; 13; 8; 5; 3; 2; 1]
> fib(fib_list)
- |> List.filter(fun n -> n % 2 = 0)
- |> List.sum
- ;;
val it : int = 4613732
>