の型はfindLargestPrimeFactor
使用法から推測されます。F# コンパイラは、上から下への方法で型の推論を実行するため、p
およびn
( のパラメーターfindLargestPrimeFactor
) の型は、関数での使用法から推論されます。コンパイラが を確認するlet result = ...
までに、パラメーターの型は既に として推論されていますint
。
最も簡単な解決策は、L
すべての定数値にサフィックスを使用することです。そのため、型は次のように推測されint64
ます。
let rec findLargestPrimeFactor p n =
if n = 1L then p
else
if n % p = 0L then findLargestPrimeFactor p (n/p)
else findLargestPrimeFactor (p + 1L) n
let result = findLargestPrimeFactor 2L 600851475143L
より洗練されたソリューションが必要な場合は、LanguagePrimitives
モジュールの一般的な 1 定数と 0 定数を使用できます。これによりfindLargestPrimeFactor
、ジェネリック(-ish)にすることができるため、さまざまな数値型でより簡単に再利用できます。
open LanguagePrimitives
let rec findLargestPrimeFactor p n =
if n = GenericOne then p
else
if n % p = GenericZero then findLargestPrimeFactor p (n/p)
else findLargestPrimeFactor (p + GenericOne) n
(* You can use one of these, but not both at the same time --
now the types of the _arguments_ are used to infer the types
of 'p' and 'n'. *)
//let result = findLargestPrimeFactor 2L 600851475143L
let result = findLargestPrimeFactor 2 Int32.MaxValue
@kvbの提案に従って、この関数を一般的に記述する方法は次のとおりです。
open LanguagePrimitives
let inline findLargestPrimeFactor p n =
let rec findLargestPrimeFactor p n =
if n = GenericOne then p
else
if n % p = GenericZero then findLargestPrimeFactor p (n/p)
else findLargestPrimeFactor (p + GenericOne) n
findLargestPrimeFactor p n
(* Now you can call the function with different argument types
as long as the generic constraints are satisfied. *)
let result = findLargestPrimeFactor 2L 600851475143L
let result' = findLargestPrimeFactor 2 Int32.MaxValue