ONLY DO WHAT ONLY YOU CAN DO

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

F# で Project Euler Problem 3

> let rec factor_list (n, factor) =
-     if   n          < factor * factor then  [n]
-     elif n % factor = 0               then factor::factor_list(n / factor, factor    )
-     else                                           factor_list(n         , factor + 1)
- ;;
 
val factor_list : int * int -> int list
 
> factor_list(13195, 2);;
val it : int list = [5; 7; 13; 29]
> factor_list(600851475143, 2);;
 
  factor_list(600851475143, 2);;
  ------------^^^^^^^^^^^^
 
stdin(29,13): error FS1147: This number is outside the allowable range for 32-bit signed integers
> factor_list(600851475143L, 2);;
 
  factor_list(600851475143L, 2);;
  ------------^^^^^^^^^^^^^
 
stdin(7,13): error FS0001: This expression was expected to have type
    int
but here has type
    int64
> let rec factor_list (n:int64, factor) =
-     if   n          < factor * factor then  [n]
-     elif n % factor = 0               then factor::factor_list(n / factor, factor    )
-     else                                           factor_list(n         , factor + 1)
- ;;
 
      elif n % factor = 0               then factor::factor_list(n / factor, factor    )
  -------------------------------------------^^^^^^
 
stdin(10,44): error FS0001: The type 'int' does not match the type 'int64'
> let rec factor_list (n:int64, factor:int64) =
-     if   n          < factor * factor then  [n]
-     elif n % factor = 0               then factor::factor_list(n / factor, factor    )
-     else                                           factor_list(n         , factor + 1)
- ;;
 
      elif n % factor = 0               then factor::factor_list(n / factor, factor    )
  ----------------------^
 
stdin(15,23): error FS0001: This expression was expected to have type
    int64
but here has type
    int
> let rec factor_list (n:int64, factor:int64) =
-     if   n          < factor * factor then  [n]
-     elif n % factor = 0L              then factor::factor_list(n / factor, factor     )
-     else                                           factor_list(n         , factor + 1L)
- ;;
 
val factor_list : int64 * int64 -> int64 list
 
> factor_list(600851475143L, 2L);;
val it : int64 list = [71L; 839L; 1471L; 6857L]
>